.Netで、この素晴らしいライブラリ HtmlAgilityPack を見つけました。これにより、XPathを使用して整形式でないHTMLを簡単に解析できます。私はこれを.Netサイトで数年間使用しましたが、私のPython、Rubyおよびその他のプロジェクト)のより苦痛なライブラリを解決する必要がありました。同様のライブラリを知っている人はいますか他の言語については?
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>
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'
BeautifulSoup は、乱雑なHTMLをクリーンな方法で処理するための適切なPythonライブラリです。
私がこれまでに得た最も安定した結果は、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]")
質問は、「XPath式を評価できるようにHTMLをXMLに変換する方法」としてより正確に述べることができるようです。
2つの優れたツールを次に示します。
TagSoup はオープンソースプログラムであり、JavaおよびSAXベースのツールです。 、 John Cowan によって開発されました。これは、Javaで記述されたSAX準拠のパーサーです。これは、整形式または有効なXMLを解析する代わりに、HTMLを解析します。これは、野生で見つかるHTMLを解析します。合理的なアプリケーション設計です。SAXインターフェースを提供することにより、標準のXMLツールを最悪のHTMLにも適用できます。TagSoupには、HTMLファイルを読み取り、クリーンなHTMLまたは整形式のXMLを生成できるコマンドラインプロセッサも含まれています。 XHTMLに近い。
Taggle は、TagSoupの商用C++ポートです。
SgmlReader は、Microsoftが開発したツールです Chris Lovett 。
SgmlReaderは、SGMLドキュメント(HTMLの組み込みサポートを含む)に対するXmlReader APIです。整形式のXML結果を出力するコマンドラインユーティリティも用意されています。
スタンドアロンの実行可能ファイルと完全なソースコードを含むZipファイルをダウンロードします: SgmlReader.Zip
Rubyについては、Jb Evainが指摘したHpricotを強くお勧めします。より高速なlibxmlベースのライバルを探している場合、Nokogiri( http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/ を参照)もかなり良いです(それはHpricotのようにXPathとCSS検索の両方をサポートしますが、より高速です)。基本的な wiki といくつかの benchmarks があります。
傑出した成果は 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。
Libxml2と呼ばれる無料のXMLのC実装があり、これはXPath用のいくつかのapiビットがあり、これを使用して、ロードされるドキュメントとしてHTMLを指定できるようになりました。これは、完全ではないHTMLドキュメントで機能しました。
ほとんどの場合、XPathは、インバウンドHTMLが適切にコーディングされ、「XML文書のように」読み取ることができる場合に最も役立ちます。 HTMLドキュメントをクリーンアップするために、この目的に固有のユーティリティの使用を検討してください。次に例を示します。 http://tidy.sourceforge.net/
これらのXPathツールに関する限り、ほとんどの実装は、実際にはlibxml2などの既存のCまたはC++ライブラリに基づいていることに気付くでしょう。