【问题标题】:Unable to Identify All Text Elements on Page with XPath无法使用 XPath 识别页面上的所有文本元素
【发布时间】:2019-02-05 18:11:55
【问题描述】:

我正在尝试识别网页上的所有文本元素。根据我在 stackoverflow 上阅读的几个线程,我提出了以下 XPath:

//*[normalize-space(.)=.][not(self::script or self::style or self::meta)]//.
//*[normalize-space(.)=.][not(self::script or self::style or self::meta)]//text()

但是,我注意到虽然这可以识别亚马逊产品页面上的数百个文本元素,但它忽略了一些重要的元素。

例如:

this 页面上,我无法识别“功能”部分并按时间部分排序:

“Echo Show 为您带来您喜爱的 Alexa 的一切......”

'明天想要..'

this 页面上,我无法识别描述部分(产品图片右侧)

这两个页​​面都有突出显示在页面上的文本,所以我不明白为什么它没有相应地识别它们。

我知道其中一些文本位于ul/li 标签下,但我认为这不是问题。

最后,是否可以将所述 XPath 与另一个属性值组合,以便它只识别具有给定属性值的文本元素(即//*[normalize-space(.)=.][not(self::script or self::style or self::meta)]//. + .//*[@id='XYZ']

谢谢

【问题讨论】:

  • 可能是因为这个:[normalize-space(.)=.] 尝试删除该谓词。我认为您还需要在另一个谓词中使用and 而不是or。示例(未经测试)://*[not(self::script) and not(self::style) and not(self::meta)]//text()
  • 另外,不清楚您所说的“文本元素”是什么意思。是选择文本节点还是选择包含文本的元素?
  • @DanielHaley 如果我删除[normalize-space(.)=.],它会识别出数百个我不想要的空白元素。我所说的文本元素是指在页面上有一些可见文本的任何元素。基本上,如果您自己查看页面,您可能会看到的那种文本。谢谢!
  • 然后试试//*[text()[not(normalize-space()='')]]。这应该选择任何具有 text() 节点的元素作为直接子节点,而不仅仅是空格。
  • 试试//body//*[text()[not(normalize-space()='')]][not(self::script or self::style or self::meta or self::noscript)]或试试//body//*[not(normalize-space(text())='')][not(self::script or self::style or self::meta or self::noscript)]

标签: java html selenium xpath web-scraping


【解决方案1】:

尝试使用:

//*[text()[not(normalize-space()='')]]

这将选择任何具有 text() 节点的元素作为直接子节点,而不仅仅是空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2018-11-27
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多