2008-11-13 102 views
23

在.Net中,我找到了這個偉大的庫,HtmlAgilityPack,它允許您使用XPath輕鬆解析非格式良好的HTML。我在.Net網站上使用過這麼多年,但我不得不爲我的Python,Ruby和其他項目尋找更痛苦的庫。有人知道其他語言的類似庫嗎?通過XPath解析HTML

回答

6

在蟒蛇,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> 
+1

您現在可能想要考慮Python的lxml – 2011-08-11 08:54:43

+8

**危險!**對lxml使用BeautifulSoup解析器,因爲elementtidy會對未聲明的名稱空間加以阻塞。我學會了艱難的道路! – 2012-02-25 04:37:58

5

BeautifulSoup是一個很好的Python庫,用於處理凌亂的HTML。

+13

BeautifulSoup不使用XPath :) – dzen 2011-05-12 15:56:13

3

看來這個問題可以更精確地表述爲「如何將HTML轉換爲XML,以便XPath表達式可以對其進行評估」「。

這裏有兩個很好的工具:

  1. TagSoup,一個開源項目,是一個Java和SAX - 基礎的工具,由John Cowan開發。這是一個用Java編寫的兼容SAX的解析器,它不是解析格式良好的或有效的XML,而是解析HTML,因爲它在野外被發現:窮人,討厭和野蠻,儘管通常很不簡單。 TagSoup專爲需要使用某種理性應用程序設計外觀來處理這些東西的人設計。通過提供SAX接口,它允許將標準XML工具應用於最差的HTML。 TagSoup還包含一個命令行處理器,用於讀取HTML文件,並可生成乾淨的HTML或與XHTML非常接近的格式良好的XML。
    Taggle是TagSoup的商業C++端口。

  2. SgmlReader是由微軟的Chris Lovett開發的工具。
    SgmlReader是任何SGML文檔(包括內置的HTML支持)的XmlReader API。還提供了一個命令行實用程序,用於輸出格式良好的XML結果。
    下載的壓縮文件,包括獨立的可執行文件和完整的源代碼:SgmlReader.zip

1

的突出成就是the pure XSLT 2.0 Parser of HTMLDavid 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。

2

對於Ruby,我強烈推薦Jb Evain指出的Hpricot。如果你正在尋找一個更快的基於libxml的競爭對手,Nokogiri(見http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/)也不錯(它支持像Hpricot這樣的XPath和CSS搜索,但速度更快)。有一個基本的wiki和一些benchmarks

+1

我強烈推薦[引入nokogiri(HTTP://引入nokogiri。 org)這幾天。這是Hpricot所做的一切以及更多。 – 2011-01-20 20:29:26

1

XML有一個免費的C實現,名爲libxml2,它有一些XPath的api位,我已經使用了很大的成功,您可以指定HTML作爲正在加載的文檔。這對我來說有些不夠完美的HTML文檔。

對於大多數情況,當入站HTML被正確編碼並且可以像「xml文檔」一樣讀取時,XPath非常有用。您可能需要考慮使用特定於此目的的實用程序來清理HTML文檔。以下是一個示例:http://tidy.sourceforge.net/

就這些XPath工具而言 - 您可能會發現大多數實現實際上都基於預先存在的C或C++庫(如libxml2)。

41

我很驚訝沒有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' 
5

我得到的最穩定的結果是使用lxml.html的soupparser。你需要安裝Python-LXML和python-beautifulsoup,那麼你就可以做到以下幾點: