私はHTMLAgilityPackをC#WPFアプリケーションで使用して、ローカルHTMLページのいくつかのアンカータグをループし、href属性を抽出します。これはうまくいきますが、アンカーがHTML文書(アンカータグでもあります)内のタイトルを見つける必要があります。これはXPathで行うには簡単にできるはずですが、すべてのシナリオで動作するステートメントを取得できないようです。
ここで私のHTMLのサンプルです(これは私が制御できません):
<html>
<body>
<table>
<tr>
<td><div><a href="#maintitle" class="title">maintitle</a></div></td>
</tr>
<tr>
<td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
</tr>
<tr>
<td><div><a href="link1.pdf">link1</a></div></td>
</tr>
<tr>
<td><div><a href="link2.pdf">link2</a></div></td>
</tr>
<tr>
<td><div><a href="link3.pdf">link3</a></div></td>
</tr>
<tr>
<td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
</tr>
<tr>
<td><div><a href="link4.pdf">link4</a></div></td>
</tr>
<tr>
<td><div><a href="link5.pdf">link5</a></div></td>
</tr>
</table>
</body>
</html>
link1を見つけたら、私はsubtitle1を探したいと思う。 link2とlink3も同様です。しかし、link4とlink5については、私はsubtitle2を探しています。私はこのXPathステートメントを使用しています(最初のセクションは、オンラインのXPathエバリュエーターhttps://www.freeformatter.com/xpath-tester.htmlで使用していたアンカータグの選択をシミュレートするためのものです) :
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr//a[@class='subtitle']
これはlink1へのlink1で機能しますが、link4とlink5ではsubtitle1とsubtitle2の両方を返します。 preceding preceding-sibling::t
[1]
を追加すると、link4のために修正されますが、link2、link3、link5のために修正されます:
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[1]//a[@class='subtitle']
私も、 preceding-sibling::t
にlast()
を追加しようとしましたが、結果としてリンクのどれも見つかりませんでした。
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[last()]//a[@class='subtitle']
私は単純な解決策があると確信していますが、私は決してXPathの能力がないので、苦労しています。最も近い兄弟を返すために元のXPathステートメントを取得するにはどうすればよいですか?
リンクテキストで字幕を取得するロケータ( 'link4')
(//a[text()='link5']/preceding::tr[.//a[@class='subtitle']])[last()]
論理:
//a[text()='link4']
- リンクテキストで要素を取得する
//a[text()='link4']/preceding::tr
- 全ての親を検索する
[.//a[@class='subtitle']]
- クラス'subtitle
'を持つタグa
を含む最初の親を取得する
(someLocator)[last()]
- ここではロケータに一致する最後の要素を取得する - クラス 'subtitle
'を持つタグa
を含む最後の親を取得する
別のオプション - 最初に要素の代わりにtr
を検索a
(//tr[.//a[text()='link5']]/preceding-sibling::tr//a[contains(@class,'subtitle')])[last()]
うまくいけば、それは誰でもロジックロゴ構築ロケータを取得するのに役立ちます
xpathを使ってみてください:
//a[@href='<your_input>']/preceding-sibling::tr[.//a[@class='subtitle']][1]
<your_input>
はlink1.pdf
からlink5.pdf