我想要抓的网页有类似的结构。每个都有一个段落,它是一个问题,一个段落是一个答案。我想抓住每个问题并回答并将它们存储在两个项目中
问题在于,在某些网页上,问题和答案分别是//xxx/p[1]
和//xxx/p[2]
,但在其他网页上,//xxx/p[1]
是一个没有任何文字的空段落,作为额外的空间。对于这些页面,//xxx/p[1]
不会给我我想要的东西。
那么是否有一个XPath表达式可以在一个节点下选择非空段落?
答案 0 :(得分:2)
如果根本没有文字,你可以使用
//p[.//text()]
选择带文字的段落。如果“空”段落包含空格(例如换行符),则必须首先规范化空格:
//p[normalize-space(.//text())]
可以缩短为
//p[normalize-space()]
答案 1 :(得分:0)
如果您将非空定义为段落包含任何类型的内容,那么以下XPath将是您想要的:
//xxx/p[node()]
这将 不 选择<p/>
和<p></p>
,但会选择以下各项:
<p>Text</p>
<p><b>Text</b></p>
<p><br/></p>
<p><!-- comment --></p>
如果您真的只关心文字内容,以下XPath将排除<p/>
和<p></p>
以及上述案例#3和#4:
//xxx/p[string(.)]
换句话说,它只选择情况#1和#2,这是段落的字符串值不为空的情况。