【问题标题】:Scrapy - HTMLPathSelector, XPath, ExtractScrapy - HTMLPathSelector、XPath、Extract
【发布时间】:2018-11-06 10:07:44
【问题描述】:

我在Mac OSX Lion 10.7.5 上使用Scrapy 0.16.5 代表Python 2.7

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

我的项目:

所以我正在制作一个抓取工具,它可以访问 BoxOfficeMojo.com 并为每部电影获取 4 个不同的信息:电影名称、电影 URL、电影发行日期和电影票房收入.然后我想把这些信息放到 MySQL 数据库中。最初,我只是想获得一页电影,特别是找到here。如您所见,这只是电影 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:', [])

同样,这只是一个次要的选择。另外,当我最初这样做时,我使用的是 row 而不是标题——只是想让它更具可读性。

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

【问题讨论】:

    标签: python-2.7 scrapy


    【解决方案1】:

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

    【讨论】:

    • 感谢您抽出宝贵时间阅读本文并发表评论!我会尽快检查并标记正确。不过现在就投票吧:-)!
    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2015-09-26
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多