下面是我正在处理的文档的模型:
<div>
<h4>Area</h4>
<span class="aclass"> </span>
<span class="bclass">
<strong>Address:</strong>
10 Downing Street
London
SW1
</span>
</div>
我得到这样的地址:
response.xpath(u".//h4[. = 'Area']/following-sibling::span[contains(.,'Address:')]/text()").extract()
返回
[u'\r\n \t', u'\r\n 10 Downing Street\r\n\r\n London \r\n \r\n SW1\r\n ']
我正在尝试使用 normalize-space 清理它。我已经尝试将它放在我能想到的每个位置,但它要么告诉我存在语法错误,要么返回一个空字符串。
更新 以添加我试图在不过多更改选择器的情况下使其正常工作。我有类似的情况,但没有 <strong>
标签,例如。在我在这里准备的示例中,选择器过于复杂,但在实际版本中,我必须采取相当复杂的路线才能到达地址。
关于可能的重复 按照可能重复的建议,我添加了 /normalize-space(.)
给这个:
(u".//h4[. = 'Area']/following-sibling::span[contains(.,'Address:')]/text()/normalize-space(.)").extract()
产生 ValueError: Invalid XPath:
错误。
最佳答案
您可以找到 strong
元素,获取以下文本兄弟 并将其规范化:
In [1]: response.xpath(u"normalize-space(.//strong[. = 'Address:']/following-sibling::text())").extract()
Out[1]: [u'10 Downing Street London SW1']
或者,您可以查看 Item Loaders以及输入和输出处理器。我经常用 Join()
, TakeFirst()
和 MapCompose(unicode.strip)
用于清理从额外的换行符或空格中提取的数据。
关于python - 在 Scrapy 中使用规范化空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33904058/