htmlの解析にはpython lxml構文ヘルプが必要
-
03-07-2019 - |
質問
私はpythonを初めて使用します。lxmlを使用してhtmlタグを検索および反復するための構文に関するヘルプが必要です。私が扱っているユースケースは次のとおりです。
HTMLファイルはかなり整形式です(完全ではありません)。画面に複数のテーブルがあり、1つには検索結果のセットが含まれ、1つにはヘッダーとフッター用があります。各結果行には、検索結果の詳細へのリンクが含まれています。
-
検索結果の行がある真ん中のテーブルを見つける必要があります(これは私が理解できました):
self.mySearchTables = self.mySearchTree.findall(".//table") self.myResultRows = self.mySearchTables[1].findall(".//tr")
-
この表に含まれるリンクを見つける必要があります(ここで行き詰まっています):
for searchRow in self.myResultRows: searchLink = patentRow.findall(".//a")
実際にはリンク要素を見つけていないようです。
-
リンクのプレーンテキストが必要です。最初に実際にリンク要素を取得した場合、
searchLink.text
のようなものになると思います。
最後に、lxmlの実際のAPIリファレンスでは、findおよびfindall呼び出しに関する情報を見つけることができませんでした。私はグーグルで見つけたコードの断片からこれらを集めました。 lxmlを使用してHTMLタグを効果的に見つけて反復する方法について何かが欠けていますか?
解決
さて、最初に、HTMLの解析に関して:zweiterlindeとS.Lottの推奨事項に従う場合は、少なくとも lxmlに含まれるbeautifulsoup 。そうすれば、素敵なxpathまたはcssセレクターインターフェイスのメリットも享受できます。
ただし、個人的にはIan Bickingの lxmlに含まれるHTMLパーサーを好みます。
第二に、 .find()
および .findall()
はElementTreeとの互換性を保とうとするlxmlからのものであり、これら2つのメソッドは ElementTreeでのXPathサポート。
これらの2つの関数は非常に使いやすいですが、XPathは非常に制限されています。完全なlxml xpath()
メソッドを使用することをお勧めしますまたは、CSSに慣れている場合は、 cssselect()
を使用しますメソッド。
次のように解析されたHTML文字列を使用した例をいくつか示します。
from lxml.html import fromstring
mySearchTree = fromstring(your_input_string)
cssセレクタークラスを使用すると、プログラムはおおよそ次のようになります。
# Find all 'a' elements inside 'tr' table rows with css selector
for a in mySearchTree.cssselect('tr a'):
print 'found "%s" link to href "%s"' % (a.text, a.get('href'))
xpathメソッドを使用した同等の方法は次のとおりです。
# Find all 'a' elements inside 'tr' table rows with xpath
for a in mySearchTree.xpath('.//tr/*/a'):
print 'found "%s" link to href "%s"' % (a.text, a.get('href'))
他のヒント
このプロジェクトで Beautiful Soup を使用していない理由はありますか?不完全な形式のドキュメントの処理がはるかに簡単になります。