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

时间:2011-08-16 07:00:27

标签: python xpath firebug bing-maps scrapy

我的项目概述:

我正在尝试在python 2.6中创建一个简单的脚本,它将从Bing Maps获取流量时间数据。我正在使用Scrapy库模块包(scrapy.org/)来浏览每个网站并从Bing地图中提取数据。

http://dl.dropbox.com/u/15387358/bing%20info.jpg

上图显示了我想要的内容。 (现在突出显示的数据部分,但最终也需要下面的时间。)

我首先做了一个测试,看看启动网址是否会消失。然后使用输出日志打印url的输出,如果它成功通过。一旦工作,我的下一步是尝试从网页中提取我需要的数据。

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

<span class="time">22 min</span>

和XPather将此作为此特定项目的路径显示。 ......

/div[@id='TaskHost_DrivingDirectionsSummaryContainer']/div[1]/span[3]

当我使用上面给定的路径在cmd中运行程序时,提取的数据打印为[],当我将/ class ='time'添加到span的末尾时,数据打印输出为[u'False' ]。当我在firebug的DOM窗口中看得更近时,我注意到get =“time”对于获取isID是错误的,而childNode持有我需要的数据。如何从childNode中提取数据?

http://dl.dropbox.com/u/15387358/Firebug%20info.jpg

以下是我目前的代码

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

CMD输出

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)

2 个答案:

答案 0 :(得分:0)

对于所有报废用途,请使用BeautifulSoup

soup.find('span', class="time")

答案 1 :(得分:0)

当网站以重要方式使用JavaScript时,您将无法信任在运行时获得的XPath,因为这是在运行JavaScript代码后获得的XPath,而Scrapy无法运行JavaScript代码。

您应该:

  1. 打开Web浏览器开发人员工具的“网络”标签。

  2. 在网站上的“网络”标签上观看网站执行的相应请求的同时,执行获取所需数据的步骤。

  3. 尝试使用Scrapy重现这些步骤(请求)。

另请参阅Debugging Spiders