再次提到了其他的建議之一,由於傑森。 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