在只有连续的带有信息标签的情况下,我试图刮擦HTML页面。

从以下代码中,我要考虑到标签的文本(例如Name1,Name2,...):

“ a”后跟“ span”给出有关该ID是否为客户的信息。

“ a”后跟“ a”表示ID为匿名。

<span class="list">
    <em>List 1:</em>
</span>
<a href="/ID/423006">Name1</a>,
<a href="/ID/115325">Name2</a>
<span class="small">(Customer)</span>,
<a href="/ID/248819">Name3</a>
<span class="small">(Non Customer)</span>,
<a href="/ID/658259">Name4</a>
<span class="small">(Customer)</span>,
<a href="/ID/294083">Name5</a>
<a href="/ID/218292">Name6</a>
<span class="small">(Non Customer)</span>


我正在使用以下XPATH尝试匹配“ a”后跟“ span”


// a [包含(@ href,'ID /')和./following-sibling::span [1] [text()='(Customer)']] / text()


即使Name1不是客户,这也将返回Name1,Name2和Name4。我究竟做错了什么?

最佳答案

这是因为该Name1的第一个后继兄弟跨度确实等于“(Customer)”。

相反,您应该做的是找到后面的第一个同级(*[1]),并检查该同级是否为span[self::span]),如果是,则检查其是否等于“(Customer) “ ...

//a[contains(@href,'ID/') and ./following-sibling::*[1][self::span][text() = '(Customer)']]/text()

关于xpath - 无法了解XPath sibling 的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57538197/

10-16 01:38