【问题标题】:XPath to look for subtreeXPath 寻找子树
【发布时间】:2013-02-03 23:08:59
【问题描述】:

我正在抓取一个 html 文档,其结构一直在变化。 Css 类名甚至会改变,所以我不能依赖它。但是,有一件事永远不会改变,该值始终包含在子树中,如下所示:

<span>
  <span>
    <span>wanted value</span>
    <span></span>wanted value
  </span>
</span>

这可以表示为 XPath 表达式吗?

它应该匹配:

<span>
  <span>
    <span> 1, one too little </span>
    <span> 2 </span>
    <span> 3, one too many </span>
    <span> 4, two too many </span>
  </span>
</span>

我打算使用 Python 的 lxml 来完成这项工作。

【问题讨论】:

    标签: xpath lxml


    【解决方案1】:

    如果想要的值的位置总是在 span 的第三级,则下面的 xpath 将起作用:

    //span/span/span[1]
    

    应用于下一个 HTML 文档时:

    <html>
      <head>
        <title>Your Title</title>
      </head>
      <body>
        <div>
        <span>
          <span>
            <span>wanted value</span>
            <span></span>
          </span>
        </span>
        </div>
        <div>
        <span>
          <span>
            <span>wanted value</span>
            <span></span>
          </span>
        </span>
        </div>
      </body>
    </html>
    

    结果将是:

    wanted value
    wanted value
    

    编辑

    如果在第三级的跨度总数等于 2 时,您只想要第三级的第一个跨度的值,则可以使用以下 XPath:

    //span/span[count(span) = 2]/span[1]
    

    【讨论】:

    • 你的表达式也会匹配有两个以上的最内层 span 元素,例如四个 span 兄弟,我希望它只在有两个时匹配。
    • @ThomasWessel:我不太明白你的意思。您可以扩展/更改您的问题或尝试使用 HTML 示例文档和所需的输出进行解释吗?
    • 更新了反例
    • @ThomasWessel:我还是不明白。当您将 XPath: //span/span/span[1] 应用于您的示例时,结果将是“1,一个太少”。因此将导致在第三层第一次出现span。这不是你想要的吗?你期望什么输出?
    • 这是一个巨大的文档,有几个地方嵌套了三个span。但只有其中一个子树,即我感兴趣的那个,在“底层”中有恰好两个 span 元素。当正好有两个时,我对其中的第一个感兴趣。如果 span 元素只有一个,或者两个以上,那么我一个都不想要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多