0

我正在Scrapy 0.16.5使用Python 2.7Mac OSX Lion 10.7.5

我对Scrapy. 我看过一些教程视频,虽然这在某些方面很有帮助,但他们无法明确回答我的一些与我当前项目有关的问题——我无法找到获得我需要的数据的解决方案。

我的项目:

所以我正在制作一个抓取工具,它可以访问 BoxOfficeMojo.com 并为每部电影获取 4 种不同的信息:电影名称、电影 URL、电影发行日期和电影票房收入。然后我想把这些信息放到 MySQL 数据库中。最初,我只是想获得一页电影,特别是在这里找到。如您所见,这只是电影 A-Ac。最终,我需要获得所有的 A,然后是所有的 B,等等。但是,就目前而言,这对于构建初始刮板很有用。

路径:

所以我不能在这里发布完整的路径,因为它最终只是发布了电影信息。导致我感兴趣的数据的 xpath 是:

  //div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]
  //div[@id="body"]/div/table/tr/td/table/tr/td/table[2]

如果您转到我上面链接到的那个页面并查看源代码,请按照 xpath,您将看到我正在查看的内容。该长字符串的第一部分是链接电影字母 AZ,然后是当前页面上的电影及其信息。

我的代码:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from BoxOfficeMojo.items import BoxofficemojoItem

class MojoSpider(BaseSpider):
   name = 'MojoSpider'
   allowed_domains = ['boxofficemojo.com']
   start_urls = ['http://www.boxofficemojo.com/movies/alphabetical.htm?letter=A&p=.htm']

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    print ('hxs:', hxs)
    titles = hxs.select('//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]') #was previously
    print ('rows:', rows)
    for title in titles:
        print ('title:', title)
        movie = title.select('/tr')
        print ('movie', movie)

    #print ('title:', titles)
    items = [] #previously = []
    #for title in titles:
        #item = BoxofficemojoItem()
        #item['title'] = title.select('/td/font/b/text()').extract() #Was:td/font/a/b/text()
        #item['link'] = title.select('/td/font/b/a/@href').extract()     #Was:td/font/a/@href
        #item['gross'] = title.select('/td/font/text()').extract()  #Was:td[3]/font/text()
        #item['release'] = title.select('/td/a/text()').extract() #Was: td[7]/font/a/text()
        #items.append(item)
    #return items

注意:我已经注释掉了一些事情并添加了打印语句,以期弄清楚发生了什么。注释掉部分的想法是标题部分中的每个项目都是一部电影。

实际打印的内容:

所以这是代码运行时实际打印出来的内容

 ('row:', <HtmlXPathSelector     xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="center" bgcolor="#dcdcdc"'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector   xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#ffffff"><'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector   xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#f4f4ff"><'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#ffffff"><'>)
 ('cells:', [])
 ('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#f4f4ff"><'>)
 ('cells:', [])

同样,这只是一个次要的选择。此外,row当我最初这样做时,我没有标题 - 只是想让它更具可读性。

当我使用注释掉的部分时,我总是得到一堆空的字典条目。

4

1 回答 1

4

请输入 string() 代替 text() 它工作正常。我为一项测试了您的代码。您可以将其余部分分开。

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    print ('hxs:', hxs)
    titles = hxs.select('//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr/td') #was previously
    #print ('title:', titles)
    items = [] #previously = []
    for title in titles:
        item = OnthegoItem()
        item['title'] = title.select('string()').extract() #Was:td/font/a/b/text()
        items.append(item)
    return items
于 2013-08-21T14:48:05.000 回答