【问题标题】: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>,但会选择以下各项:

    1. <p>Text</p>
    2. <p><b>Text</b></p>
    3. <p><br/></p>
    4. <p><!-- comment --></p>

    如果您真的只关心文本内容,以下 XPath 将排除 <p/><p></p> 以及上面的案例 #3 和 #4:

    //xxx/p[string(.)]
    

    换句话说,它只会选择案例#1和#2,即段落的字符串值不为空的情况。

    【讨论】: