web-dev-qa-db-ja.com

Python:ローカルで/特定の要素でxpathを使用する

Xpathを使用してページからリンクを取得しようとしています。問題は、テーブル内のリンクのみが必要なことですが、ページ全体にxpath式を適用すると、不要なリンクがキャプチャされます。

例えば:

tree = lxml.html.parse(some_response)
links = tree.xpath("//a[contains(@href, 'http://www.example.com/filter/')]")

問題は、式をドキュメント全体に適用することです。必要な要素を見つけました。例:

tree = lxml.html.parse(some_response)
root = tree.getroot()
table = root[1][5] #for example
links = table.xpath("//a[contains(@href, 'http://www.example.com/filter/')]")

しかし、私はまだテーブルの外のリンクをキャプチャしているので、それはドキュメント全体でもクエリを実行しているようです。 このページ は、「xpath()が要素で使用されると、XPath式は要素(相対の場合)またはルートツリー(絶対の場合)に対して評価されます:」と述べています。それで、私が使用しているのは絶対式であり、それを相対式にする必要がありますか?それですか?

基本的に、このテーブル内に存在する要素のみをフィルタリングするにはどうすればよいですか?

42
pvt pns

Xpathはスラッシュ(/)したがって、絶対的です。ドットを追加します(.)現在の要素を基準にして、前に配置します。

links = table.xpath(".//a[contains(@href, 'http://www.example.com/filter/')]")
64
phihag

別のオプションは、テーブル内の要素を直接要求することです。例えば:

tree = lxml.html.parse(some_response)
links = tree.xpath("//table[**criteria**]//a[contains(@href, 'http://www.example.com/filter/')]")

どこ **criteria**ページに多くのテーブルがある場合は、必要です。考えられる基準のいくつかは、テーブルIDまたはクラスに基づいてフィルタリングすることです。例えば:

links = tree.xpath("//table[@id='my_table_id']//a[contains(@href, 'http://www.example.com/filter/')]")
0
Pablo Guerrero