Java 无法使用XPath标识页面上的所有文本元素
我试图识别网页上的所有文本元素。根据我在stackoverflow上读到的几个线程,我提出了以下XPath:Java 无法使用XPath标识页面上的所有文本元素,java,html,selenium,xpath,web-scraping,Java,Html,Selenium,Xpath,Web Scraping,我试图识别网页上的所有文本元素。根据我在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() 然而,我注意到,虽然这在Amazon产品页面上标识了数百个文本元素,但
//*[normalize-space(.)=.][not(self::script or self::style or self::meta)]//.
//*[normalize-space(.)=.][not(self::script or self::style or self::meta)]//text()
然而,我注意到,虽然这在Amazon产品页面上标识了数百个文本元素,但却遗漏了一些重要的元素
例如:
在第页,我无法识别“功能”部分和“按时间顺序”部分:
“Echo Show带给你关于Alexa的一切你爱的东西”
“明天就要……”
在第页,我无法识别描述部分(紧靠产品图像右侧)
这两个页面都有突出显示在页面上的文本,因此我不明白为什么没有相应地识别它们
我知道其中一些文本在ul/li
标签下,但我认为这不是问题所在
最后,是否可以将所述XPath与另一个属性值组合,以便它仅识别具有给定属性值的文本元素(即,/*[normalize space(.)=.][非(self::script或self::style或self::meta)]/.
+/*[@id='XYZ']
)
谢谢尝试使用:
//*[text()[not(normalize-space()='')]]
这将选择任何具有text()节点的元素作为直接子元素,而不仅仅是空格。可能是因为:
[规范化空格(.)=.]
尝试删除该谓词。我认为您还需要在另一个谓词中使用和而不是或。例如(未测试):/*[非(self::script)而不是(self::style)和不是(self::meta)//text()
同样,不清楚“文本元素”是什么意思。你想选择文本节点还是选择包含文本的元素?@DanielHaley如果我删除[规范化空间(.)=。]
它标识了数百个我不想要的空白元素。所谓文本元素,我指的是任何在页面上有可见文本的元素。基本上,就是你自己查看页面时可能看到的文本类型。谢谢!也许可以尝试/*[text()[not(normalize-space()='')]
。这样应该选择任何有文本()的元素节点作为不只是空白的直接子节点。请尝试//*[text()[not(normalize-space()='')][not(self::script或self::style或self::meta或self::noscript)]
或尝试//*[not(normalize space(text())=''][not not(self::script或self::style或self::meta或self::noscript)]