在.Net中,我找到了這個偉大的庫,HtmlAgilityPack,它允許您使用XPath輕鬆解析非格式良好的HTML。我在.Net網站上使用過這麼多年,但我不得不爲我的Python,Ruby和其他項目尋找更痛苦的庫。有人知道其他語言的類似庫嗎?通過XPath解析HTML
回答
在蟒蛇,ElementTidy解析標籤湯及產生的元素樹,它允許查詢使用XPath:
>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB
>>> tb = TB()
>>> tb.feed("<p>Hello world")
>>> e= tb.close()
>>> e.find(".//{http://www.w3.org/1999/xhtml}p")
<Element {http://www.w3.org/1999/xhtml}p at 264eb8>
看來這個問題可以更精確地表述爲「如何將HTML轉換爲XML,以便XPath表達式可以對其進行評估」「。
這裏有兩個很好的工具:
TagSoup,一個開源項目,是一個Java和SAX - 基礎的工具,由John Cowan開發。這是一個用Java編寫的兼容SAX的解析器,它不是解析格式良好的或有效的XML,而是解析HTML,因爲它在野外被發現:窮人,討厭和野蠻,儘管通常很不簡單。 TagSoup專爲需要使用某種理性應用程序設計外觀來處理這些東西的人設計。通過提供SAX接口,它允許將標準XML工具應用於最差的HTML。 TagSoup還包含一個命令行處理器,用於讀取HTML文件,並可生成乾淨的HTML或與XHTML非常接近的格式良好的XML。
Taggle是TagSoup的商業C++端口。SgmlReader是由微軟的Chris Lovett開發的工具。
SgmlReader是任何SGML文檔(包括內置的HTML支持)的XmlReader API。還提供了一個命令行實用程序,用於輸出格式良好的XML結果。
下載的壓縮文件,包括獨立的可執行文件和完整的源代碼:SgmlReader.zip
的突出成就是the pure XSLT 2.0 Parser of HTML寫David Carlisle。
閱讀它的代碼對我們每個人來說都是一個很好的學習練習。
從描述:
「d:htmlparse(字符串)
d:htmlparse(字符串,命名空間,HTML模式)
的一個參數的形式是等同於)
d:htmlparse(字符串, 'http://ww.w3.org/1999/xhtml',真()))
解析使用一些內置啓發式)字符串作爲HTML和/或XML 控制隱含的元素打開和關閉。
它不具有HTML DTD的全部知識,但確實有
空元素和實體定義完整列表的完整列表。HTML實體和
十進制和十六進制字符引用都被接受。注意html-entities
即使在html-mode = false()的情況下也被識別。
元素名稱小寫(如果HTML模式是真實的()),並放入該命名空間參數(其可以是「」指定的
命名空間來表示
無命名空間,除非輸入已顯式命名空間聲明,在
這些將被兌現這種情況下。
屬性名小寫如果HTML模式=真()「
閱讀更詳細的描述here。
希望這有助於。
乾杯,
Dimitre Novatchev。
對於Ruby,我強烈推薦Jb Evain指出的Hpricot。如果你正在尋找一個更快的基於libxml的競爭對手,Nokogiri(見http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/)也不錯(它支持像Hpricot這樣的XPath和CSS搜索,但速度更快)。有一個基本的wiki和一些benchmarks。
我強烈推薦[引入nokogiri(HTTP://引入nokogiri。 org)這幾天。這是Hpricot所做的一切以及更多。 – 2011-01-20 20:29:26
XML有一個免費的C實現,名爲libxml2,它有一些XPath的api位,我已經使用了很大的成功,您可以指定HTML作爲正在加載的文檔。這對我來說有些不夠完美的HTML文檔。
對於大多數情況,當入站HTML被正確編碼並且可以像「xml文檔」一樣讀取時,XPath非常有用。您可能需要考慮使用特定於此目的的實用程序來清理HTML文檔。以下是一個示例:http://tidy.sourceforge.net/
就這些XPath工具而言 - 您可能會發現大多數實現實際上都基於預先存在的C或C++庫(如libxml2)。
我很驚訝沒有lxml的單提。它非常快,並且可以在任何允許CPython庫的環境中工作。
以下是方法you can parse HTML via XPATH using lxml。
>>> from lxml import etree
>>> doc = '<foo><bar></bar></foo>'
>>> tree = etree.HTML(doc)
>>> r = tree.xpath('/foo/bar')
>>> len(r)
1
>>> r[0].tag
'bar'
>>> r = tree.xpath('bar')
>>> r[0].tag
'bar'
我得到的最穩定的結果是使用lxml.html的soupparser。你需要安裝Python-LXML和python-beautifulsoup,那麼你就可以做到以下幾點:
- 1. 通過nokogiri和xpath解析圖像
- 2. HTML通過PHP解析器
- 3. 通過HTML與PHP解析
- 4. 通過Java解析HTML-docs
- 5. node js xpath解析html表
- 6. XPath的問題HTML解析
- 7. 使用XPath/XMLHttpRequest解析HTML
- 8. 使用Xpath解析HTML
- 9. 解析不帶xpath的HTML
- 10. 用xpath或cssSelector解析HTML?
- 11. 通過Emacs Lisp解析HTML文件
- 12. 的Python HTML解析通過CSS選擇
- 13. 通過HTML頁面解析JSON數據
- 14. jquery ajax通過返回html解析
- 15. 通過ajax解析jQuery html(文本)
- 16. 與PHP一起使用Xpath解析HTML
- 17. 嘗試使用HtmlCleaner和XPath解析html
- 18. 可能用xpath解析這個html嗎?
- 19. 在Python中使用lxml解析HTML,xpath
- 20. XPath的 - 需要解析一些HTML
- 21. 使用JavaScript解析HTML使用Xpath
- 22. Dom和xpath查詢爲html解析
- 23. 使用HtmlAgilityPack-Xpath解析HTML文檔,RegExp
- 24. PHP Xpath - 解析平坦的HTML結構
- 25. 使用lxml和xpath解析Html
- 26. python3用xpath解析html部分
- 27. java xpath解析
- 28. Python xpath解析
- 29. XPath通過解析HTML表格的特定文本來定位單元格
- 30. 如何使用html5lib解析HTML,並使用XPath查詢解析的HTML?
您現在可能想要考慮Python的lxml – 2011-08-11 08:54:43
**危險!**對lxml使用BeautifulSoup解析器,因爲elementtidy會對未聲明的名稱空間加以阻塞。我學會了艱難的道路! – 2012-02-25 04:37:58