【问题标题】:Download PDF files from webpage从网页下载 PDF 文件
【发布时间】:2019-11-23 18:26:20
【问题描述】:

我正在尝试从网站下载文件。我目前的解决方案似乎有效,但有些事情我不明白。

第一个问题出现时:

//div[@class='large-4 medium-4 columns']//a

还有其他类为large-4 medium-4 columns 的div。所以我得到了几个不必要的链接。如何摆脱它们?我只需要包含/products/的页面

第二个问题是没有任何东西下载到C:\temp\,我想有一些东西:

//div[@class='large-6 medium-8 columns large-centered']/a[string-length(@href)>0]

但是怎么了?

“xxx”是我代码中的链接,应该是

Imports HtmlAgilityPack

Module Module1

    Sub Main()
        Dim mainUrl As String = "xxx"
        Dim htmlDoc As HtmlDocument = New HtmlWeb().Load(mainUrl) '< - - - Load the webage into htmldocument

        Dim listLinks As New List(Of String)

        Dim srcs As HtmlNodeCollection = htmlDoc.DocumentNode.SelectNodes("//div[@class='large-4 medium-4 columns']//a") '< - - - select nodes with links
        For Each src As HtmlNode In srcs

            ' Store links in array
            listLinks.Add(src.Attributes("href").Value)

            Console.WriteLine(src.Attributes("href").Value)

        Next

        Console.Read()

        For Each productLink As String In listLinks
            Dim prodDoc As HtmlDocument = New HtmlWeb().Load(productLink)

            Dim scrapedsrcs As HtmlNodeCollection = prodDoc.DocumentNode.SelectNodes("//div[@class='large-6 medium-8 columns large-centered']/a[string-length(@href)>0]") '< - - - select nodes with links

            If scrapedsrcs IsNot Nothing Then
                For Each scrapedlink As HtmlNode In scrapedsrcs
                    ' Show links in console
                    'Console.WriteLine($"-- {scrapedlink.Attributes("href").Value}") '< - - - Print urls  

                    My.Computer.Network.DownloadFile(scrapedlink.Attributes("href").Value, "C:\temp\" & System.IO.Path.GetFileName(scrapedlink.Attributes("href").Value) & ".pdf")
                Next
            End If
        Next

        Console.Read()

        ' End of scraping

    End Sub

End Module

编辑:

好的,第一个应该是

//div[@class='row inset1 productItem padb1 padt1']/div[@class='large-4 medium-4 columns']//a

【问题讨论】:

  • 这个错误是因为你不明白如何选择路径,产品名称是“large-4 medium-4 columns”但也是“row inset1 productItem padb1 padt1”的一部分,就像一个房子是街道(或城市,或国家,或星球......)的一部分。因此,与其仅仅指定你想要房子,不如指定更多的东西。例如,这看起来像使用i.imgur.com/x0Yg1iH.png 的快速简便的过滤器
  • 好的,现在我明白了。所以应该是//div[@class='row inset1 productItem padb1 padt1']/div[@class='large-4 medium-4 columns']//a
  • 看这个:/html/body/div[something6]/div[something2]/div[something1]/a 是一个产品的完整路径,现在,你可以通过html得到它//a 但有很多其他垃圾,所以不要这样做,而是指定更接近的东西。
  • 另外,如果这些路径是文件夹,/ 表示“仅此文件夹”// 表示“此文件夹及其子文件夹”。
  • 是的,现在我得到了所有需要的链接。但是pdf链接似乎不起作用。这个//div[@class='row padt6 padb4']/div[@class='large-6 medium-8 columns large-centered']/a[string-length(@href)&gt;0]还是有问题

标签: vb.net xpath web-scraping web-crawler


【解决方案1】:

这会将手册下载到运行应用程序的文件夹中:

    Dim htmlDoc As HtmlDocument = New HtmlWeb().Load("https://webpage.com")
    Dim ProductListPage As HtmlNodeCollection = htmlDoc.DocumentNode.SelectNodes("//div[@class='productContain padb6']//div[@class='large-4 medium-4 columns']/a")
    For Each src As HtmlNode In ProductListPage
        htmlDoc = New HtmlWeb().Load(src.Attributes("href").Value)
        Dim LinkTester As HtmlNodeCollection = htmlDoc.DocumentNode.SelectNodes("//div[@class='row padt6 padb4']//a")
        If LinkTester IsNot Nothing Then
            For Each dllink In LinkTester
                Dim LinkURL As String = dllink.Attributes("href").Value
                Console.WriteLine(LinkURL)

                Dim ExtractFilename As String = LinkURL.Substring(LinkURL.LastIndexOf("/"))
                Dim DLClient As New WebClient
                DLClient.DownloadFileAsync(New Uri(LinkURL), ".\" & ExtractFilename)
            Next
        End If
    Next

【讨论】:

  • 那是一个短一点的版本...我会去其他网站练习并尝试让真正的版本正常工作。
  • 直到今天它工作正常,源代码似乎是一样的。但是,这现在正在删除一个错误。你知道为什么吗?
  • 好的,那可能是另一个问题的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多