首页 文章

如何使用XPath选择非空段?

提问于
浏览
1

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

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

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

2 回答

  • 2

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

    //p[.//text()]
    

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

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

    这可以缩短为

    //p[normalize-space()]
    
  • 0

    如果您将非空定义为段落具有任何类型的内容,则以下XPath将是您想要的:

    //xxx/p[node()]
    

    这将 not 选择 <p/><p></p> ,但会选择以下各项:

    • <p>Text</p>

    • <p><b>Text</b></p>

    • <p>
      </p>

    • <p><!-- comment --></p>

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

    //xxx/p[string(.)]
    

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

相关问题