2

我 99% 确定我hxs.select在这个网站上发生了什么事。我无法提取任何东西。当我运行以下代码时,我没有收到任何错误反馈。title或者link没有被填充。有什么帮助吗?

def parse(self, response):
    self.log("\n\n\n We got data! \n\n\n")
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//div[@class=\'footer\']')
    items = []
    for site in sites:
        item = CarrierItem()
        item['title'] = site.select('.//a/text()').extract()
        item['link'] = site.select('.//a/@href').extract()
        items.append(item)
    return items

有没有办法可以调试这个?我还尝试使用scrapy shell带有 url 的命令,但是当我view(response)在 shell 中输入时,它只是返回True并打开一个文本文件而不是我的 Web 浏览器。

>>> 响应.url
'https://qvpweb01.ciq.labs.att.com:8080/dis/login.jsp'

>>> hxs.select('//div')
回溯(最近一次通话最后):
    文件“”,第 1 行,在
AttributeError:“NoneType”对象没有属性“选择”

>>> 视图(响应)
真的

>>> hxs.select('//body')
回溯(最近一次通话最后):
    文件“”,第 1 行,在
AttributeError:“NoneType”对象没有属性“选择”
4

2 回答 2

1

Scrapy shell 确实是一个很好的工具。如果您的文档有一个 XML 样式表,那么它可能就是一个 XML 文档。所以你可以使用scrapy shellxxs而不是hxs这个关于删除命名空间的Scrapy文档示例:http: //doc.scrapy.org/en/latest/topics/selectors.html#removing-namespaces

当这不起作用时,我倾向于回到纯 lxml.etree 并转储整个文档的元素:

import lxml.etree
import lxml.html

class myspider(BaseSpider):
    ...
    def parse(self, response):
        self.log("\n\n\n We got data! \n\n\n")
        root = lxml.etree.fromstring(response.body).getroot()
        # or for broken XML docs:
        # root = lxml.etree.fromstring(response.body, parser = lxml.etree.XMLParser(recover=True)).getroot()
        # or for HTML:
        # root = lxml.etree.fromstring(response.body, parser=lxml.html.HTMLParser()).getroot()

        # and then lookup what are the actual elements I can select
        print list(root.iter()) # this could be very big, but at least you all what's inside, the element tags and namespaces
于 2013-07-14T21:51:05.880 回答
1

您可以从命令行使用 pdb 并在文件中添加断点。但这可能涉及一些步骤。

(windows调试可能略有不同)

  1. 找到您的scrapy可执行文件:

    $ whereis scrapy
    /usr/local/bin/scrapy
    
  2. 将其称为 python 脚本并启动 pdb

    $ python -m pdb /usr/local/bin/scrapy crawl quotes
    
  3. 进入调试器外壳后,打开另一个外壳实例并找到蜘蛛脚本的路径(位于您的蜘蛛项目中)

    $ realpath path/to/your/spider.py
    /absolute/spider/file/path.py
    

这将输出绝对路径。将其复制到剪贴板。

  1. 在 pdb 外壳类型中:

    b /absolute/spider/file/path.py:line_number
    

...其中行号是调试该文件时所需的中断点。

  1. c在调试器中点击...

现在去做一些 PythonFu :)

于 2017-10-07T06:11:54.547 回答