使用Scrapy for Python从html路径提取数据

使用Scrapy for Python从html路径提取数据,python,xpath,firebug,bing-maps,scrapy,Python,Xpath,Firebug,Bing Maps,Scrapy,我的项目概述: 我试图在Python2.6中创建一个简单的脚本,该脚本将从Bing地图中获取交通时间数据。Scrapy library模块包(Scrapy.org/)是我用来浏览每个网站并从Bing地图中提取数据的工具 上面的图片显示了我想要的。(突出显示的数据部分暂时还没有,但最终也需要下面的时间。) 我首先做了一个测试,看看起始url是否可以通过。然后使用输出日志打印url的输出(如果成功通过)。一旦成功了,我的下一步就是尝试从网页中提取我需要的数据 我一直在使用Firebug、XPath

我的项目概述:

我试图在Python2.6中创建一个简单的脚本,该脚本将从Bing地图中获取交通时间数据。Scrapy library模块包(Scrapy.org/)是我用来浏览每个网站并从Bing地图中提取数据的工具

上面的图片显示了我想要的。(突出显示的数据部分暂时还没有,但最终也需要下面的时间。)

我首先做了一个测试,看看起始url是否可以通过。然后使用输出日志打印url的输出(如果成功通过)。一旦成功了,我的下一步就是尝试从网页中提取我需要的数据

我一直在使用Firebug、XPather和XPath-Firefox插件来查找我要提取的数据的html路径。这个链接非常有助于指导我正确编码路径(doc.scrapy.org/topics/selectors.html)。从萤火虫来看,这就是我想要提取的

<span class="time">22 min</span>
当我使用上面给定的路径在cmd中运行程序时,提取的数据打印为[],当我将/class='time'添加到span末尾时,数据打印为[u'False']。当在firebug的DOM窗口中仔细查看时,我注意到class=“time”对于get isID是false,而childNode保存了我需要的数据。如何从childNode提取数据

下面是到目前为止我的代码

from scrapy import log # This module is useful for printing out debug information
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector, XPathSelectorList, XmlXPathSelector
import html5lib

    class BingSpider(BaseSpider):
        name = 'bing.com/maps'
        allowed_domains = ["bing.com/maps"]
        start_urls = [
                "http://www.bing.com/maps/?FORM=Z9LH4#Y3A9NDAuNjM2MDAxNTg1OTk5OTh+LTc0LjkxMTAwMzExMiZsdmw9OCZzdHk9ciZydHA9cG9zLjQwLjcxNDU0OF8tNzQuMDA3MTI1X05ldyUyMFlvcmslMkMlMjBOWV9fX2VffnBvcy40MC43MzE5N18tNzQuMTc0MTg1MDAwMDAwMDRfTmV3YXJrJTJDJTIwTkpfX19lXyZtb2RlPUQmcnRvcD0wfjB+MH4="
                     ]

    def parse(self, response):
        self.log('A response from %s just arrived!' % response.url)
        x = HtmlXPathSelector(response)
        time=x.select("//div[@id='TaskHost_DrivingDirectionsSummaryContainer']/div[1]/span[3]").extract()
        print time
指令输出

2011-09-05 17:43:01-0400 [scrapy] DEBUG: Enabled item pipelines:
2011-09-05 17:43:01-0400 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:602
3
2011-09-05 17:43:01-0400 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2011-09-05 17:43:01-0400 [bing.com] INFO: Spider opened
2011-09-05 17:43:02-0400 [bing.com] DEBUG: Crawled (200) <GET http://www.bing.co
m/maps/#Y3A9NDAuNzIzMjYwOTYzMTUwMDl+LTc0LjA5MDY1NSZsdmw9MTImc3R5PXImcnRwPXBvcy40
MC43MzE5N18tNzQuMTc0MTg1X05ld2FyayUyQyUyME5KX19fZV9+cG9zLjQwLjcxNDU0OF8tNzQuMDA3
MTI0OTk5OTk5OTdfTmV3JTIwWW9yayUyQyUyME5ZX19fZV8mbW9kZT1EJnJ0b3A9MH4wfjB+> (refer
er: None)
2011-09-05 17:43:02-0400 [bing.com] DEBUG: A response from http://www.bing.com/m
aps/ just arrived!
[]
2011-09-05 17:43:02-0400 [bing.com] INFO: Closing spider (finished)
2011-09-05 17:43:02-0400 [bing.com] INFO: Spider closed (finished)
2011-09-05 17:43:01-0400[scrapy]调试:启用的项目管道:
2011-09-05 17:43:01-0400[scrapy]调试:Telnet控制台在0.0.0.0:602上侦听
3.
2011-09-05 17:43:01-0400[scrapy]调试:Web服务侦听0.0.0.0:6080
2011-09-05 17:43:01-0400[bing.com]信息:蜘蛛开启
2011-09-05 17:43:02-0400[bing.com]调试:爬网(200)(参考
呃:没有)
2011-09-05 17:43:02-0400[bing.com]调试:来自的响应http://www.bing.com/m
aps/刚到!
[]
2011-09-05 17:43:02-0400[bing.com]信息:关闭蜘蛛(已完成)
2011-09-05 17:43:02-0400[bing.com]信息:蜘蛛关闭(完成)

用于所有报废用途


当网站大量使用JavaScript时,您不能信任运行时得到的XPath,因为这是JavaScript代码运行后得到的XPath,而Scrapy不运行JavaScript代码

你应该:

  • 打开web浏览器开发人员工具的“网络”选项卡

  • 在网站上执行获取所需数据的步骤,同时在“网络”选项卡上查看网站执行的相应请求

  • 尝试用Scrapy重现这些步骤(请求)


  • 另请参见。

    是否有必要使用scrapy库?使用正则表达式编写自定义代码来提取数据。我想我应该提到的是,我对html代码知之甚少(更不用说我的编程知识非常贫乏,因为我在大学里的老师非常糟糕。)我只是从scrapy的文档中学习一些东西,并从w3schools学习一些关于html和XPath的知识。在我身上发生过好几次,网站根据您的浏览器返回不同的html。在浏览器中测试xpath查询以及通过scrapy(或curl,或其他方式)下载时,只需检查返回的正文是否相同即可。
    /div[@id='TaskHost_DrivingDirectionsSummaryContainer']//span[@class='time']]/text()
    也可以尝试一下
    允许的_域=[“bing.com/maps”]
    我认为应该是
    允许的_域=[“bing.com”]
    ,因为域实际上是
    bing.com
    我应该安装什么版本的BeautifulSoup。我已经安装了3.0.8,并且我得到了一个语法错误:由于类的原因,语法无效。我应该这样设置我的代码吗……soup=BeautifulSoup(str)time=soup.find('span',attrs{class':“time”})
    2011-09-05 17:43:01-0400 [scrapy] DEBUG: Enabled item pipelines:
    2011-09-05 17:43:01-0400 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:602
    3
    2011-09-05 17:43:01-0400 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
    2011-09-05 17:43:01-0400 [bing.com] INFO: Spider opened
    2011-09-05 17:43:02-0400 [bing.com] DEBUG: Crawled (200) <GET http://www.bing.co
    m/maps/#Y3A9NDAuNzIzMjYwOTYzMTUwMDl+LTc0LjA5MDY1NSZsdmw9MTImc3R5PXImcnRwPXBvcy40
    MC43MzE5N18tNzQuMTc0MTg1X05ld2FyayUyQyUyME5KX19fZV9+cG9zLjQwLjcxNDU0OF8tNzQuMDA3
    MTI0OTk5OTk5OTdfTmV3JTIwWW9yayUyQyUyME5ZX19fZV8mbW9kZT1EJnJ0b3A9MH4wfjB+> (refer
    er: None)
    2011-09-05 17:43:02-0400 [bing.com] DEBUG: A response from http://www.bing.com/m
    aps/ just arrived!
    []
    2011-09-05 17:43:02-0400 [bing.com] INFO: Closing spider (finished)
    2011-09-05 17:43:02-0400 [bing.com] INFO: Spider closed (finished)
    
    soup.find('span', class="time")