Python 2.7 Scrapy-HTMLPathSelector、XPath、Extract

Python 2.7 Scrapy-HTMLPathSelector、XPath、Extract,python-2.7,scrapy,Python 2.7,Scrapy,我在macosxlion10.7.5上为python2.7使用scrapy0.16.5 我对Scrapy相当陌生。我看了大量的教程视频,虽然这些视频在某些方面很有帮助,但他们还不能肯定地回答与我当前项目相关的一些问题——我还没有找到一个解决方案来获得我需要的数据 我的项目: 因此,我正在制作一个刮片器,它可以访问BoxOfficeMojo.com,为每部电影获取4种不同的内容:电影标题、电影URL、电影发行日期以及电影总收入。然后我想把这些信息放到一个MySQL数据库中。起初,我只是想看一页电影

我在
macosxlion10.7.5
上为
python2.7
使用
scrapy0.16.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进行操作,您将看到我正在查看的内容。长字符串的第一部分是电影字母A-Z的链接,然后是当前页面上的电影及其信息

我的代码:

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:', [])
(“行:”,)
(“单元格:”,[])
(“行:”,)
(“单元格:”,[])
(“行:”,)
(“单元格:”,[])
(“行:”,)
(“单元格:”,[])
(“行:”,)
(“单元格:”,[])
同样,这只是一个小选择。另外,我最初做这项工作时,用
代替了标题,只是想让它更具可读性

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

请键入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
请键入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

感谢您花时间通读并发表评论!我会尽快检查并标记正确。现在就投票吧:-)!感谢您花时间通读并发表评论!我会尽快检查并标记正确。现在就投票吧:-)!