如何利用Scrapy的Python XPath提取器从带换行的span中分别提取两个值?
如何用Scrapy XPath分别提取span下的两个文本节点
当然可以分别提取出"Word 1"和"Sentence 1"!咱们先聊聊你之前尝试没奏效的原因,再给出可行的解决办法。
问题根源
你遇到的问题大概率是因为文本节点里包含了换行、空格这类空白字符,或者调用XPath的方式没精准定位到单个文本节点。比如//span/text()会返回span下所有文本节点的集合,直接用substring-before的话,它没法处理集合,只能处理单个节点;而//span/text()[1]其实能拿到第一个文本节点,但它的内容可能是"Word 1\n"(带换行),看起来和预期的"Word 1"不一样,所以你误以为没奏效。
解决方案
下面是两种在Scrapy里的可行做法:
方法1:用XPath位置索引 + Python字符串清理
直接定位到对应位置的文本节点,再用Python的strip()去掉多余的空白和换行:
# 提取第一个文本节点并清理 word_1 = response.xpath('//span/text()[1]').get().strip() # 提取第二个文本节点并清理 sentence_1 = response.xpath('//span/text()[2]').get().strip()
方法2:用XPath的normalize-space()直接处理
XPath内置的normalize-space()函数可以自动去掉文本前后的空白,同时把中间的多个空白换成单个空格,一步到位:
word_1 = response.xpath('normalize-space(//span/text()[1])').get() sentence_1 = response.xpath('normalize-space(//span/text()[2])').get()
补充:修复你之前的substring-before尝试
如果你想用substring-before,需要指定单个文本节点作为参数,比如针对第一个文本节点里的换行符提取:
word_1 = response.xpath('substring-before(//span/text()[1], "\n")').get()
不过这种方法依赖于明确的分隔符(比如这里的\n),不如前两种通用。
验证小技巧
你可以先在Scrapy shell里测试XPath表达式,确认返回的内容:
scrapy shell "你的目标页面URL" # 然后输入 response.xpath('//span/text()').getall()
这会返回所有文本节点的原始内容,你就能看到每个节点里的空白字符情况,方便调整提取逻辑。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

