我正在创建一个新的scrapy蜘蛛,一切都很顺利,虽然我的其中一个网站有问题,其中response.xpath返回列表中的对象,html代码中不存在:
{"pdf_name": ["\n\t\t\t\t\t\t\t\t\t", "ZZZZZZ", "\n\t\t\t\t\t\t\t\t\t", "PDF", "\n\t\t\t\t\t\t\t\t"],
{"pdf_name": ["\n\t\t\t\t\t\t\t\t\t\t", "YYYYYY", "\n\t\t\t\t\t\t\t\t\t\t", "XXXXXX"]}
如下所示,这些“空”对象(\ t和\ n)不包含在HTML标记中。如果我理解正确,xpath在标记之前包含空格:
<div class="inner d-i-b va-t" role="group">
<a class="link-to" href="A.pdf" target="_blank">
<i class="offscreen">ZZZZZZ</i>
<span>PDF</span>
</a>
<div class="text-box">
<a href="A.pdf">
<i class="offscreen">YYYYYY</i>
<p>XXXXXX</p></a>
</div>
</div>
我知道我可以剥离()字符串并删除空格,尽管它只会缓解问题,而不会消除主要问题,即结果中包含空格。
为什么会这样?如何将XPath结果仅限制为标签(我之前认为它是默认完成的)?
蜘蛛代码 - 解析函数(pdf_name导致问题)
def parse(self, response):
# Select all links to pdfs
for pdf in response.xpath('//a[contains(@href, ".pdf")]'):
item = PdfItem()
# Create a list of text fields for links to PDFs and their descendants
item['pdf_name'] = pdf.xpath('descendant::text()').extract()
yield item
答案 0 :(得分:2)
空白是文档的一部分。仅仅因为你认为它不重要并不会让它消失。
文本节点是一个文本节点,无论它是由' '
(空格字符)还是任何其他字符组成,都没有任何区别。
您可以使用normalize-space()
XPath函数规范化空白:
def parse(self, response):
for pdf_link in response.xpath('//a[contains(@href, ".pdf")]'):
item = PdfItem()
item['pdf_name'] = pdf_link.xpath('normalize-space(.)').extract()
yield item
首先,normalize-space()
将其参数转换为string,这是通过连接所有后代文本节点来完成的。然后它修剪前导和尾随空格,并将任何连续的空格(包括换行符)折叠到一个空格中。像'\n bla \n\n bla '
这样的内容会变成'bla bla'
。