【问题标题】:How to use XPath to select non-empty paragraph?如何使用 XPath 选择非空段落?
【发布时间】:2026-02-19 02:20:11
【问题描述】:
我要抓取的网页具有相似的结构。每个都有一个作为问题的段落和一个作为答案的段落。我想抓取每个问题和答案并将它们存储在两个项目中
问题是,在某些页面上,问题和答案分别是//xxx/p[1]和//xxx/p[2],但在其他页面上,//xxx/p[1]是一个没有任何文字的空段落,用作额外的空格。对于这些页面,//xxx/p[1] 不会给我我想要的。
那么有没有一个XPath表达式可以选择一个节点下的非空段落呢?
【问题讨论】:
标签:
html
xml
xpath
scrapy
【解决方案1】:
如果根本没有文字,你可以使用
//p[.//text()]
选择带有文本的段落。如果“空”段落包含空格(例如换行符),则必须先规范化空格:
//p[normalize-space(.//text())]
可以简写为
//p[normalize-space()]
【解决方案2】:
如果你定义 non-empty 来表示段落有任何类型的内容,那么下面的 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,即段落的字符串值不为空的情况。