【发布时间】: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)>0]还是有问题
标签: vb.net xpath web-scraping web-crawler