【发布时间】: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