【问题标题】:what is the way to strip something from text() using xpath?使用 xpath 从 text() 中删除某些内容的方法是什么?
【发布时间】:2017-02-03 16:28:33
【问题描述】:

我在 python 中使用 xpath 从 html 文件中解析表。我正在使用这个 xpath:

//td//text()

这给了我两个字符串的输出:

['australia', '$3333.99']

我想要的输出:

['australia', '3333.99']

但我想去掉 $ 符号,我一般如何使用 xpath 来做到这一点?我试过substring-after,但它不起作用。

我就是这样尝试的:

//td//text()[substring-after(.,'$')]

但我得到了这个输出:

['$3333.99']

结果中缺少Australia

【问题讨论】:

  • 您尝试的表达式在 XPath 2.0 中很好,但在 XPath 1.0 中不行。您应该指定正在使用的 XPath 版本。虽然它不能完全满足您的要求:尝试//td//text()/substring-after(.,'$')

标签: python xpath


【解决方案1】:

除了使用translate()(在另一个答案中发布)之外,您还可以使用substring() function 并动态确定切片的开头:

In [4]: [item.xpath("substring(., starts-with(., '$') + 1)") for item in root.xpath("//td")]
Out[4]: ['australia', '3333.99']

顺便说一句,这种方法比使用translate() 更安全一些,因为这里我们只在字符串开头删除单个$ 字符(如果存在),但translate() 会替换所有出现的字符$ 在您提取的每个 td 文本中。您可能会得到一些不需要的副作用。

请注意,在任何情况下,您都必须分两步完成 - 如果像 translate(//td//text(), "$", "") 那样使用 translate()substring() 函数,则不会将其应用于每个节点,参考:

或者,您可以使用 Python 和 .lstrip() 修剪它:

[item.lstrip("$") for item in root.xpath("//td//text()")]

【讨论】:

  • 我知道这一点,但我不想循环列表,因为我有超过 500 个,这会使函数变慢。我正在寻找一种使用 xpath mayb 的方法,使用 translate
  • @anekix 看到了翻译变体并决定发布另一种方法,检查一下
  • @anekix 也链接了一个关于为什么你不能一次性完成并且必须有一个额外循环的讨论。
【解决方案2】:
//td//text()[substring-after(.,'$')]

这将评估['australia', '$3333.99'] 中的text(),并为 australia,它不包含$,这将返回false并且不会显示在结果中

[td.xpath('translate(., "$", "")')for td in tree.xpath("//td")]

【讨论】:

  • @anekix xpath 用于定位标签,而不是修改标签。是的,xpath 路径可以完成这个任务,但是 python strip 是更好的选择。
  • 我有 500 个列表来应用 lstrip,我知道这没什么大不了的,但我必须为 400 个表做这个,所以现在它的 400X500 我认为它是一个昂贵的循环,它会减慢我的应用程序
  • 不一样吗?我的意思是我必须对列表进行单独的迭代,对吗?
  • @anekix 是的,这是不可避免的
  • @anekix 我认为你应该在使用 xpath 之前删除 html 文件中的所有 $,这样效率很高
猜你喜欢
  • 2012-03-30
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多