web-dev-qa-db-ja.com

xpathを使用して要素を次々に選択する

私は同様の質問を見ましたが、私が見た解決策は以下では機能しません。私はXPathの専門家からはほど遠いです。 HTMLを解析する必要があります。ヘッダー2に続くテーブルを選択するにはどうすればよいですか?以下の解決策は機能するはずだと思いましたが、明らかに機能しません。誰かがここで私を助けることができますか?

content = """<div>
<p><b>Header 1</b></p>
<p><b>Header 2</b><br></p>
<table>
<tr>
    <td>Something</td>
</tr>
</table>
</div>
"""

from lxml import etree
tree = etree.HTML(content)
tree.xpath("//table/following::p/b[text()='Header 2']")
12
jseabold

軸を使用して以下のXPATH 1.0を使用する必要があります preceding

 //table[preceding::p[1]/b[.='Header 2']]
10
Arup Rakshit

@Arupの答えのいくつかの代替案:

tree.xpath("//p[b='Header 2']/following-sibling::table[1]")

「Header2」を含むtableヘッダーを含むpに続く最初のb兄弟を選択します

tree.xpath("//b[.='Header 2']/following::table[1]")

「ヘッダー2」を含むtableの後のドキュメント順で最初のbを選択します

さまざまな軸の詳細については、 XPath 1.0仕様 を参照してください。

  • following軸には、コンテキストノードの後に​​あるコンテキストノードと同じドキュメント内のすべてのノードが含まれますドキュメントの順序で、子孫を除外し、属性ノードと名前空間ノードを除外します

  • following-sibling軸には、コンテキストノードの次のすべての兄弟が含まれます。コンテキストノードが属性ノードまたは名前空間ノードの場合、次の兄弟軸は空です。

13
paul trmbrth