【问题标题】:xpath - get count of rows based on some textxpath - 根据某些文本获取行数
【发布时间】:2014-02-07 06:09:41
【问题描述】:

我正在编写 xpaths 以从以下页面中选择左侧边栏上每个类别下的所有链接: http://www.indexmundi.com/commodities/'>http://www.indexmundi.com/commodities/

我想一一选择每个类别下的链接。我编写了以下 xpath,它以某种方式选择了第一类(商品价格指数)下的链接。但我想知道如何选择其他类别下的链接。我想在 h3 上添加一个检查,如果它的文本是 Energy,计算并选择之前的所有行,然后如果 h3 文本是饮料,计数并选择能源和饮料之间的所有行

.//*[@id='dlCommodities']/tbody/tr[position()

这是另一个 xpath: .//*[@id='dlCommodities']/tbody/tr[preceding-sibling::tr/td/h3[. = '能量'] 和以下兄弟姐妹::tr/td/h3[. = '饮料']]/td/a

它满足第二个要求,即选择特定标题之间的行,但它缺少一个节点。

请帮我修复这些 xpath 或建议一个更好的。

谢谢

【问题讨论】:

  • 该页面实际上并不包含tbody 元素,但如果将 HTML 解析为 DOM,则会添加它们。如果您遇到包含tbody 轴步骤的XPath 表达式问题,请考虑stackoverflow.com/questions/18241029/…

标签: xpath xpath-2.0


【解决方案1】:

我将您的实际问题理解为:查找属于给定类别的所有链接。为此,请找到类别,然后检索下一个类别之前的所有元素。

如果您愿意,可以删除换行符,我添加它们是为了便于阅读。

//tr[td/h3="Energy"]/(self::tr, following-sibling::tr[
  . << //tr[td/h3="Energy"]/following-sibling::tr[td/h3][1]
])

如果您没有兼容 XPath 2.0 的处理器,则不能使用 &lt;&lt; 运算符来测试节点顺序(当前节点必须位于下一个类别之前)。 XPath 1.0 解决方案更短一些,但在我看来可读性更差:

//tr[td/h3="Energy"] | //tr[td/h3="Energy"]/following-sibling::tr[
  ./preceding-sibling::tr[td/h3][1][td/h3="Energy"] and not(td/h3)
]

两个查询都会选择一个类别的所有节点;要计算它们,请将它们包装成count(...)

【讨论】:

  • 不幸的是,第一个 xpath 不适合我。第二个 xpath 正在正确选择所需的节点,但只有一个节点。它错过了包含类别名称的行并选择了下一个类别的第一行。
  • 永远不要说“不适合我”,总是解释为什么。您是否收到错误消息?查询是否产生错误的输出?如果您不详细解释发生了什么问题,没有人能够帮助您。关于丢失的第一项:我的错,没有意识到它与标题一起包含在同一行中。这也是为什么包含下一个类别的第一项的原因,也是固定的。查看编辑。
  • 我在 Firefox 的 firebug 中尝试过,但出现“Invalid xpath”错误。然后我尝试在 Scrapy xpath 选择器link 中使用它,在这种情况下我也收到了相同的消息。
  • 这是因为它是一个 XPath 2.0 表达式。 Firefox 和 Scrapy 都不支持 XPath 2.0。你为什么用xpath-2.0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多