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