我试图使用高度变化的HTML结构来抓取网站。感兴趣的信息未封装。唯一的标记是目标ID为TARGETID的跨度。
结构是:
<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>
我的方法是:
//h2/span[contains(text(), 'TARGETID')]/../following-sibling::ul[1][count(li) > 1][li]//a/text()
在TARGETID之后存在无序列表时会成功,但如果没有,则会找到它找到的下一个无序列表(根据查询有意义)。
我的问题是:我如何将查询限制在两个H2的节点上,从包含目标ID的跨度的节点开始,并受到任何后续H2的限制,跨度为不同的id? / p>
非常感谢任何提示。
答案 0 :(得分:0)
这个XPath,
//ul[preceding::h2[1][.='TARGETID']]//a
将选择a
下的所有ul
元素,这些元素出现在h2
之后,字符串值为"TARGETID"
但在任何其他h2
元素之前。
所以,对于这个扩展的例子,
<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>
。