首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scrapy - HTMLPathSelector,XPath,Extract

Scrapy - HTMLPathSelector,XPath,Extract
EN

Stack Overflow用户
提问于 2013-07-30 02:24:55
回答 1查看 2.1K关注 0票数 0

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

我对Scrapy还是个新手。我看了一大堆教程视频,虽然这在某些方面是有帮助的,但他们还没有能够明确地回答我的一些问题,这些问题与我当前的项目有关-我还没有找到一个解决方案来获得我需要的数据。

我的项目:

因此,我正在努力建立一个BoxOfficeMojo.com的刮板,并为每部电影获得4个不同的东西:电影名称,电影网址,电影上映日期和电影票房收入。然后,我想将此信息放入MySQL数据库中。最初,我只是希望得到一页电影,特别是找到here。如你所见,这只是一部电影。最终,我将需要得到所有的A,然后是所有的B,等等。但是,现在,这对于构建一个初始的刮板是很好的。

路径:

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

代码语言:javascript
复制
  //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,然后是当前页面上的电影及其信息。

我的代码:

代码语言:javascript
复制
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

注意:我已经注释掉了一些东西,并添加了打印语句,希望弄清楚是怎么回事。注释掉的部分的想法是,标题部分中的每一项都是一部电影。

实际打印的内容:

下面是代码运行时实际打印出来的内容

代码语言:javascript
复制
 ('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而不是title --只是想让它更具可读性。

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

EN

回答 1

Stack Overflow用户

发布于 2013-08-21 22:48:05

请在text()的位置键入string(),它工作正常。我测试了你的一个项目的代码。你可以把剩下的分开。

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17931427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档