2016-09-14 11 views
0

非常に変化するHTML構造を使用してサイトをスクラップしようとしています。関心のある情報はカプセル化されていません。唯一のマーカーは、ターゲットIDがTARGETIDのスパンです。Xpath:存在する場合、ノードの隣にノードを見つける

構造は次のとおりです。

<h2> 
    <span class="TARGETID">TARGETID</span> 
</h2> 
<p> <!-- this is not always present, could be more p tags --> </p> 
<ul> <!-- also not always present, if there, this is what we want --> </ul> 
<h2> 
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span> 
</h2> 

私のアプローチだった:順不同リストはTARGETID後に存在するが、いない場合、それは次の順序なしリストを取り、それは(見つけたときに成功し

//h2/span[contains(text(), 'TARGETID')]/../following-sibling::ul[1][count(li) > 1][li]//a/text() 

これはクエリに基づいて意味があります)。

質問:2つのH2のノードにクエリを限定するには、どのようにターゲットIDのスパンを含むものから始まり、異なるIDのスパンを持つH2によって制限されますか?

ご意見をいただければ幸いです。

+0

はい、正確です。例の行6の次の 'h2'がクエリのリミッタとして機能します。これらの 'h2'の中の' ul'が存在しない場合、 'ul'の抽出をさらに避けるべきです。 – leandermelms

答えて

0

このXPathの、

//ul[preceding::h2[1][.='TARGETID']]//a 

"TARGETID"の文字列値を持つh2後で、他のh2の要素の前に発生しulの下にすべてのaの要素を選択します。

要求されたように、この拡張された例えば、

<div> 
    <h2> 
    <span class="TARGETID">TARGETID</span> 
    </h2> 
    <p> <!-- this is not always present, could be more p tags --> </p> 
    <ul> <a href="example.com">link1</a> </ul> 
    <h2> 
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span> 
    </h2> 
    <ul> <a href="example.com">link2</a> </ul> 
    <h2> 
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span> 
    </h2> 
</div> 

は、それは、唯一の

<a href="example.com">link1</a> 

ない<a href="example.com">link2</a>を選択することになります。

+0

ありがとうございます! '// ul [preceding :: h2 [1]/span [@ id = 'TARGETID']] // a ' これはちょうど私が探していたものでした。 – leandermelms

関連する問題