【问题标题】:Xpath first occurrence of a treeXpath 第一次出现树
【发布时间】:2013-07-23 10:19:44
【问题描述】:

我想找到一棵树的第一次出现。示例:

<div id='post>
<p>text1</p>
<p>text2</p>
<img src="a.jpg">
<img src="b.jpg">
<p>text3</p>
<p>text4</p>
<img src="c.jpg">
<p>text5</p>
</div>

我想找到“p/img/@src”的第一次出现。

当我进行 xpath 搜索时:.//div/p/img[1]/@src
它给出了 2 个命中,a.jpg 和 c.jpg

只有第一次出现 (a.jpg) 的 xpath 是什么。 我会说.//div/(p/img)[1]/@src,但当然不行。

【问题讨论】:

  • p/img/@src 的第一次出现?那就是(p/img/@src)[1]。但是p/img 表示img 父元素的img 子元素,而您的示例仅是p 元素的img 兄弟元素。
  • 但括号“(”“)”在 lxml 中不起作用。我收到此错误: exceptions.ValueError: Invalid XPath: //div[@id="post"]/div[@class="body"]/(p/img/@src)[1]
  • 括号应该是:(//div[@id="post"]/div[@class="body"]/p/img/@src)[1] 然后就可以了。谢谢

标签: xpath scrapy lxml


【解决方案1】:

最好的选择是:

(//img[@src])[1]/@src

(//p//img[@src])[1]/@src

确保img 自身位于p 元素中。

【讨论】:

    【解决方案2】:

    正如 Martin 所说,img 不是 p 的孩子。此外,在您的示例中,div 中缺少 id 属性的单引号关闭和 img 的标记关闭。 在这里您的 xml 已更正:

    <div id='post'>
       <p>text1</p>
       <p>text2</p>
       <img src="a.jpg"/>
       <img src="b.jpg"/>
       <p>text3</p>
       <p>text4</p>
       <img src="c.jpg"/>
       <p>text5</p>
    </div>
    

    现在选择您可以使用的第一张图片,只需 //img[1]/@src//img[@src="a.jpg"]

    【讨论】:

    • 这只是一个展示我的问题的例子。在实时情况下,我不知道 img src 是什么。
    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多