web-dev-qa-db-ja.com

XPathを介してHTMLを解析する

.Netで、この素晴らしいライブラリ HtmlAgilityPack を見つけました。これにより、XPathを使用して整形式でないHTMLを簡単に解析できます。私はこれを.Netサイトで数年間使用しましたが、私のPython、Rubyおよびその他のプロジェクト)のより苦痛なライブラリを解決する必要がありました。同様のライブラリを知っている人はいますか他の言語については?

26

Pythonでは、 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>
6
Aaron Maenpaa

Lxmlについての言及が1つもないことに驚いています。非常に高速で、CPythonライブラリを使用できるすべての環境で動作します。

以下はその方法です lxmlを使用してXPATH経由でHTMLを解析できます

>>> 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'
51
Jagtesh Chadha

BeautifulSoup は、乱雑なHTMLをクリーンな方法で処理するための適切なPythonライブラリです。

5
Ned Batchelder

私がこれまでに得た最も安定した結果は、lxml.htmlのsoupparserを使用してきました。 python-lxmlとpython-beautifulsoupをインストールする必要があります。そうすると、次のことができます。

from lxml.html.soupparser import fromstring
tree = fromstring('<mal form="ed"><html/>here!')
matches = tree.xpath("./mal[@form=ed]")
5
Gareth Davidson

質問は、「XPath式を評価できるようにHTMLをXMLに変換する方法」としてより正確に述べることができるようです。

2つの優れたツールを次に示します。

  1. TagSoup はオープンソースプログラムであり、JavaおよびSAXベースのツールです。 、 John Cowan によって開発されました。これは、Javaで記述されたSAX準拠のパーサーです。これは、整形式または有効なXMLを解析する代わりに、HTMLを解析します。これは、野生で見つかるHTMLを解析します。合理的なアプリケーション設計です。SA​​Xインターフェースを提供することにより、標準のXMLツールを最悪のHTMLにも適用できます。TagSoupには、HTMLファイルを読み取り、クリーンなHTMLまたは整形式のXMLを生成できるコマンドラインプロセッサも含まれています。 XHTMLに近い。
    Taggle は、TagSoupの商用C++ポートです。

  2. SgmlReader は、Microsoftが開発したツールです Chris Lovett
    SgmlReaderは、SGMLドキュメント(HTMLの組み込みサポートを含む)に対するXmlReader APIです。整形式のXML結果を出力するコマンドラインユーティリティも用意されています。
    スタンドアロンの実行可能ファイルと完全なソースコードを含むZipファイルをダウンロードします: SgmlReader.Zip

3

Rubyについては、Jb Evainが指摘したHpricotを強くお勧めします。より高速なlibxmlベースのライバルを探している場合、Nokogiri( http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/ を参照)もかなり良いです(それはHpricotのようにXPathとCSS検索の両方をサポートしますが、より高速です)。基本的な wiki といくつかの benchmarks があります。

2
Chu Yeow

傑出した成果は HTMLの純粋なXSLT 2.0パーサーDavid Carlisle

そのコードを読むことは、私たち全員にとって素晴らしい学習課題です。

説明から:

"d:htmlparse(string)
d:htmlparse(string、namespace、html-mode)

1つの引数形式は次と同等です)
d:htmlparse(string、 ' http://ww.w3.org/1999/xhtml '、true()))

組み込みのヒューリスティックを使用して、文字列をHTMLやXMLとして解析します)
暗黙の要素の開閉を制御します。

HTML DTDの完全な知識はありませんが、完全なリストはあります
空の要素とエンティティ定義の完全なリスト。 HTMLエンティティ、および
10進および16進文字の参照はすべて受け入れられます。 htmlエンティティに注意してください
html-mode = false()であっても認識されます.

要素名は小文字になり(html-modeがtrue()の場合)、
namespaceパラメータで指定された名前空間(「」は、
入力に明示的な名前空間宣言がない限り、名前空間なし
その場合、これらは尊敬されます。

html-mode = true()
の場合、属性名は小文字になります "

詳細な説明を読む ここ

これがお役に立てば幸いです。

乾杯、

Dimitre Novatchev。

1

Libxml2と呼ばれる無料のXMLのC実装があり、これはXPath用のいくつかのapiビットがあり、これを使用して、ロードされるドキュメントとしてHTMLを指定できるようになりました。これは、完全ではないHTMLドキュメントで機能しました。

ほとんどの場合、XPathは、インバウンドHTMLが適切にコーディングされ、「XML文書のように」読み取ることができる場合に最も役立ちます。 HTMLドキュメントをクリーンアップするために、この目的に固有のユーティリティの使用を検討してください。次に例を示します。 http://tidy.sourceforge.net/

これらのXPathツールに関する限り、ほとんどの実装は、実際にはlibxml2などの既存のCまたはC++ライブラリに基づいていることに気付くでしょう。

1
Klathzazt