【发布时间】:2016-02-27 12:11:44
【问题描述】:
下面是我正在处理的文档的模型:
<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: 错误。
【问题讨论】:
-
关于重复问题参考:
.//h4[. = 'Area']/following-sibling::span[contains(.,'Address:')]/text()/normalize-space(.)在 XPath 2 中有效,但 在 XPath 1.0 中无效(仅在 lxml/libxml2 之上,scrapy 支持)。引用已接受的答案there:“在 XPath 2.0 中,XPath 表达式的定位步骤可能是函数引用”。这在 XPath 1.0 中是不可能的 -
另一种选择是在
<span>上使用normalize-space()或string()和地址,并使用正则表达式链接.re(r)和r=re.compile(r'Address:(.*)', re.S)或类似的。selector.xpath('.//h4[.="Area"]/following-sibling::span[starts-with(normalize-space(), "Address")]').xpath('string()').re(r)会给你[u'\n 10 Downing Street\n\n London\n\n SW1\n '](我使用string()因为换行很重要,normalize-space()会用空格替换它们)
标签: python parsing xpath web-scraping scrapy