如何使用XPath选择非空段?

时间:2016-01-04 17:28:43

标签: html xml xpath scrapy

我想要抓的网页有类似的结构。每个都有一个段落,它是一个问题,一个段落是一个答案。我想抓住每个问题并回答并将它们存储在两个项目中

问题在于,在某些网页上,问题和答案分别是//xxx/p[1]//xxx/p[2],但在其他网页上,//xxx/p[1]是一个没有任何文字的空段落,作为额外的空间。对于这些页面,//xxx/p[1]不会给我我想要的东西。

那么是否有一个XPath表达式可以在一个节点下选择非空段落?

2 个答案:

答案 0 :(得分:2)

如果根本没有文字,你可以使用

//p[.//text()]

选择带文字的段落。如果“空”段落包含空格(例如换行符),则必须首先规范化空格:

//p[normalize-space(.//text())]

可以缩短为

//p[normalize-space()]

答案 1 :(得分:0)

如果您将非空定义为段落包含任何类型的内容,那么以下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>
  5. 如果您真的只关心文字内容,以下XPath将排除<p/><p></p>以及上述案例#3和#4:

    //xxx/p[string(.)]
    

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