Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何使用XPath选择非空段落?_Html_Xml_Xpath_Scrapy - Fatal编程技术网

Html 如何使用XPath选择非空段落?

Html 如何使用XPath选择非空段落?,html,xml,xpath,scrapy,Html,Xml,Xpath,Scrapy,我想抓取的网页有类似的结构。每个段落都有一个问题段落和一个答案段落。我想把每个问题和答案都擦掉,并存储在两个项目中 问题是,在某些页面上,问题和答案分别是//xxx/p[1]和//xxx/p[2],但在其他页面上,//xxx/p[1]是一个空段落,没有任何文本,这是一个额外的空间。对于这些页面,//xxx/p[1]无法满足我的需求 那么是否有一个XPath表达式可以选择一个节点下的非空段落呢?如果没有文本,可以使用 //p[.//text()] 选择包含文本的段落。如果“空”段落包含空格(例如

我想抓取的网页有类似的结构。每个段落都有一个问题段落和一个答案段落。我想把每个问题和答案都擦掉,并存储在两个项目中

问题是,在某些页面上,问题和答案分别是
//xxx/p[1]
//xxx/p[2]
,但在其他页面上,
//xxx/p[1]
是一个空段落,没有任何文本,这是一个额外的空间。对于这些页面,
//xxx/p[1]
无法满足我的需求


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

如果没有文本,可以使用

//p[.//text()]
选择包含文本的段落。如果“空”段落包含空格(例如换行符),则必须首先规范化空格:

//p[normalize-space(.//text())]
可以缩短为

//p[normalize-space()]
如果将non-empty定义为表示段落具有任何类型的内容,则以下XPath将是您想要的:

//xxx/p[node()]
这将选择

,但将选择以下各项:

  • 文本

  • 文本


  • 如果您真的只关心文本内容,那么以下XPath将排除

    以及上面的案例3和案例4:

    换句话说,它将只选择案例1和案例2,这两种情况下段落的字符串值不是空的。

    可能重复
    //xxx/p[text()]
    //xxx/p[string(.)]