我正在刮这样的XML文档:
>>> response.xpath("//ul[@class='meta-info d-flex flex-wrap align-items-center list-unstyled justify-content-around']/li[position()=2]/text()").extract()
并提供以下输出:
['\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t23 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ', '\n ', '\n\t\t\t ', '\n\t\t\t\t24 Feb, 2019 ']
但是我不希望任何字段是换行符,制表符或空格,因此我尝试使用normalize-space()
函数,如下所示:
>>> response.xpath("normalize-space(//ul[@class='meta-info d-flex flex-wrap align-items-center list-unstyled justify-content-around']/li[position()=2]/text())").extract()
但是我得到的输出为空:
['']
这是怎么回事?
答案 0 :(得分:1)
如果要测试它,我使用正则表达式解决了类似的问题,下面将我包括在内。我发现它运作良好。 question应该回答规范化空间的情况。预计会在文本节点上返回一个空字符串。
import re
item_text = response.xpath("//ul[@class='meta-info d-flex flex-wrap align-items-center list-unstyled justify-content-around']/li[position()=2]/text()").extract()
re.sub('[\s]{2,}', '\n', "".join(item_text).strip())
答案 1 :(得分:1)
normalize-space()
处理单个字符串。您将为其提供完整的节点列表。
因此它需要第一个,将其转换为字符串,然后返回结果。您的第一个节点的值为'\n '
。
在for
上写一个//ul[@class='meta-info d-flex flex-wrap align-items-center list-unstyled justify-content-around']/li[position()=2]
循环,并在各个节点上调用normalize-string()
。