scrapy中的XPath返回不存在的元素

时间:2016-09-19 09:16:46

标签: python xpath scrapy

我正在创建一个新的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

1 个答案:

答案 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'