再次提到了其他的建议之一,由于杰森。 HTMLAgilityPack取得了诀窍。为了帮助他人,我将发布一些我觉得有用的代码片段(因为产品上的文档很稀疏)。
1)在您的ASP.NET应用程序中,将HtmlAgilityPack.dll和HtmlAgilityPack.XML复制到您的BIN文件夹中。
通过右键单击解决方案资源管理器中的顶部行并查看“属性页”来检查以确认它已注册。如果HtmlAgilityPack不在您的参考文献中,请单击[AddDownArrow],添加引用,Bin,HtmlAgilityPack,确定。
2)捕获的Web页并将其转换成一个HTML DOC:从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)检查每个链接在DOC中并收集网址:
For Each vLinkNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//a")
vLinkList = vLinkList & vLinkNode.GetAttributeValue("href", "") & vbCrLf
Next
5)检查每个WITH CSS类= “item_class” 并收集TEXT:
For Each vDivNode As HtmlAgilityPack.HtmlNode In vPage_Doc.DocumentNode.SelectNodes(".//div[@class='item_class']")
vPageText = vPageText & vDivNode.InnerText & vbCrLf
Next
6)提取物中的DOC标题和说明:
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
或者在doc体内的名称:
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的所有贡献者为您提供的所有帮助!
你在做什么,需要MSHTML? AFAIK是客户端组件,不是服务器应该需要的东西。 – Jason 2010-09-22 20:52:02
我的应用程序做了很多HTML文档解析 - getElementById,getElementsByTagName,这样的事情。这些都是由mshtml启用的。是否有另一个包含这些函数的库? – Tom 2010-09-22 21:21:51
http://stackoverflow.com/questions/56107/what-is-the-best-way-to-parse-html-in-c – Jason 2010-09-22 21:48:56