【问题标题】:XPath in scrapy returns elements which don't existscrapy中的XPath返回不存在的元素
【发布时间】:2016-09-19 09:16:45
【问题描述】:

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

我知道我可以 strip() 字符串并删除空格,尽管它只会缓解问题,而不是删除主要问题,即在结果中包含空格。

为什么会这样?如何将 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

【问题讨论】:

  • 由于操作是 JSON 格式,您会看到 \t 和 \n。如果您将它们加载到数据库中,您将拥有必要的空白。
  • 感谢@Backtrack 提供信息。问题是我不想有空格,也不想 \t 和 \n - 它根本不应该包含在结果中。我正在寻找标签中的文本,而不是在标签之外进行格式化。有什么想法可以改进吗?
  • 这里是一个例子:stackoverflow.com/questions/5992177/…

标签: python xpath scrapy


【解决方案1】:

空格是文档的一部分。仅仅因为认为它不重要并不会让它消失。

一个文本节点就是一个文本节点,不管它是由' '(空格字符)还是任何其他字符组成都没有区别。

您可以使用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() 将其参数转换为字符串,这是通过连接所有后代文本节点来完成的。然后它修剪前导和尾随空格并将任何连续的空格(包括换行符)折叠成一个空格。像'\n bla \n\n bla ' 这样的东西会变成'bla bla'

【讨论】:

  • 感谢您的宝贵意见和回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
相关资源
最近更新 更多