再次感谢杰森。 HTMLAgilityPack 做到了。
为了帮助他人,我将发布一些我认为有用的代码 sn-ps(因为有关产品的文档很少)。
1) 在您的 ASP.NET 应用程序中,将 HtmlAgilityPack.dll 和 HtmlAgilityPack.XML 复制到您的 BIN 文件夹中。
通过右键单击解决方案资源管理器中的顶行并查看“属性页”来检查它是否已注册。如果 HtmlAgilityPack 尚未在您的 References 中,请单击 [AddDownArrow],Add Reference,Bin,HtmlAgilityPack,OK。
2) 捕获网页并将其转换为 HTML 文档:
改编自EggheadCafe's excellent Asynchronous Task example:
Public Function OnBegin(...)
vRequest = WebRequest.Create("http://www.stackoverflow.com")
Return vRequest.BeginGetResponse(cb, extraData)
End Function
Public Sub OnEnd(...)
Private vPage_Text As String = ""
Private vPage_Doc As New HtmlAgilityPack.HtmlDocument
Using response As WebResponse = vRequest.EndGetResponse(ar)
Using reader As StreamReader = New StreamReader(response.GetResponseStream())
vPage_Text = reader.ReadToEnd()
vPage_Doc.LoadHtml(vPage_Text)
End Using
End Using
End Sub
3) 提取整个 HTML 文档:
vText = vPage_Doc.DocumentNode.OuterHtml
4) 检查文档中的每个链接并收集 URL:
For Each vLinkNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//a")
vLinkList = vLinkList & vLinkNode.GetAttributeValue("href", "") & vbCrLf
Next
5) 使用 CSS class="item_class" 检查所有内容并收集文本:
For Each vDivNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//div[@class='item_class']")
vPageText = vPageText & vDivNode.InnerText & vbCrLf
Next
6) 提取文档的标题和描述:
Dim vTitleNode As HtmlAgilityPack.HtmlNode = vPage_Doc.DocumentNode.SelectSingleNode(".//title")
vTitleText = vTitleNode.InnerText
Dim vDescriptionNode As HtmlAgilityPack.HtmlNode = vPage_Doc.DocumentNode.SelectSingleNode(".//meta[@name='description']")
vDescriptionText = vDescriptionNode.InnerText
或文档正文中的标题:
vBodyTitle = vPage_Doc.DocumentNode.SelectSingleNode(".//h1")
7) 通过其 ID 提取元素:
Dim vBigImageNode As HtmlAgilityPack.HtmlNode = vPage_Doc.GetElementbyId("BigImage")
vImage_URL = vBigImageNode.GetAttributeValue("src", "")
vImage_Height = vBigImageNode.GetAttributeValue("height", "")
vImage_Width = vBigImageNode.GetAttributeValue("width", "")
8) 移除一个节点:
vMovieNode.SelectSingleNode(".//div[@class='viewer-reviews']").Remove()
最后,当没有明显的节点或其他“连接点”时,我需要提取页面的一个小节。诀窍是识别任何可以“找到”的东西(例如标签或评论),这些东西可以用作文档已选择节点中的分割点。然后插入插入结束和开始标签,从而在节点中创建 2 个单独的小节。最后,从编辑的节点创建一个新的 HTML 文档并选择新定义的节点。 (如果您不理解所有这些,请按照代码进行操作。)
所以这里是绝密的,从未公开过的,
9) 提取文档的任何部分:
Dim vNewDoc As New HtmlAgilityPack.HtmlDocument
vNewDoc.LoadHtml(vOldDivNode.OuterHtml.Substring(0, vOldDivNode.OuterHtml.IndexOf("<!-- comment") - 1) & _
"</div><div class=""my_new_node"">" & _
vOldDivNode.OuterHtml.Substring(vOldDivNode.OuterHtml.IndexOf("<!-- comment") - 1))
Dim vNewDivNode = vNewDoc.SelectSingleNode(".//div[@class='my_new_node']")
Dim vHaHaICapturedYou As String = vNewDivNode.InnerText
当然,既然我已经告诉过你,我必须杀了你。
感谢 Stack Overflow 的所有贡献者为我提供的所有帮助!