使用Scrapy解析站点,按照下一页,写为XML

时间:2011-06-30 03:23:33

标签: python request yield scrapy

当我评论一段代码时,我的脚本效果非常好:返回项目

这是我的代码,更改为http://example.com,因为看起来其他人可能会保留“抓取”合法性问题。

class Vfood(CrawlSpider):
        name = "example.com"
        allowed_domains = [ "example.com" ]
        start_urls = [
                "http://www.example.com/TV_Shows/Show/Episodes"
        ]

        rules = (
                Rule(SgmlLinkExtractor(allow=('example\.com', 'page='), restrict_xpaths = '//div[@class="paginator"]/
span[@id="next"]'), callback='parse'),
        )

        def parse(self, response):
                hxs = HtmlXPathSelector(response)
                items = []
                countries = hxs.select('//div[@class="index-content"]')
                tmpNextPage = hxs.select('//div[@class="paginator"]/span[@id="next"]/a/@href').extract()
                for country in countries:
                        item = FoodItem()
                        countryName = country.select('.//h3/text()').extract()
                        item['country'] = countryName
                        print "Country Name: ", countryName
                        shows = country.select('.//div[@class="content1"]')
                        for show in shows.select('.//div'):
                                showLink = (show.select('.//h4/a/@href').extract()).pop()
                                showLocation = show.select('.//h4/a/text()').extract()
                                showText = show.select('.//p/text()').extract()
                                item['showURL'] = "http://www.travelchannel.com"+str(showLink)
                                item['showcity'] = showLocation
                                item['showtext'] = showText
                                item['showtext'] = showText
                                print "\t", showLink
                                print "\t", showLocation
                                print "\t", showText
                                print "\n"
                                items.append(item)
                        **#return items**

                for NextPageLink in tmpNextPage:
                        m = re.search("Location", NextPageLink)
                        if m:
                                NextPage = NextPageLink
                                print "Next Page:  ", NextPage
                                yield Request("http://www.example.com/"+NextPage, callback = self.parse)
                        else:
                                NextPage = 'None'
SPIDER = food()

如果我解除了#return项目,我收到以下错误:

yield Request("http://www.example.com/"+NextPage, callback = self.parse)
SyntaxError: 'return' with argument inside generator

通过在那里留下评论,我无法以XML格式收集数据,但是通过print语句的结果,我确实看到了我应该在屏幕上显示的所有内容。

我获取xml的命令:

scrapy crawl example.com --set FEED_URI=food.xml --set FEED_FORMAT=xml

当我解除上面的 返回项 行时,我创建了XML文件,但脚本停止了,不会跟随链接。

3 个答案:

答案 0 :(得分:4)

您将返回一个项目列表(可能位于错误的位置),稍后您将使用yield来生成请求。你不能在python中混合yield和return。

将所有内容添加到列表中并在解析方法结束时返回它或在任何地方使用yield。我的建议是将items.append(item)替换为yield item并删除对项目列表的所有引用。

答案 1 :(得分:3)

这是否回答了您的问题:http://www.answermysearches.com/python-fixing-syntaxerror-return-with-argument-inside-generator/354/

  

此错误告诉您,当您在函数内部使用yield使其成为生成器时,您只能使用不带参数的return。

我还建议使用像这样的项目加载器

def parse(self, response):
    l = XPathItemLoader(item=Product(), response=response)
    l.add_xpath('name', '//div[@class="product_name"]')
    l.add_xpath('name', '//div[@class="product_title"]')
    l.add_xpath('price', '//p[@id="price"]')
    l.add_xpath('stock', '//p[@id="stock"]')
    l.add_value('last_updated', 'today') # you can also use literal values
    return l.load_item()

答案 2 :(得分:1)

CrawlSpider类使用Parse方法,因此您应该将您的特定解析方法命名为其他方法,例如parse_item()。请参阅“抓取规则”http://doc.scrapy.org/topics/spiders.html#scrapy.spider.BaseSpider