Используя Scrapy для разбора сайта, следуйте по следующей странице, пишите как XML - PullRequest
3 голосов
/ 30 июня 2011

Мой скрипт прекрасно работает, когда я комментирую один фрагмент кода: возвращаем элементы .

Вот мой код, который меняется на 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()

Если я ОБНАРУЖИВАЮ # возвратные пункты, я получаю следующую ошибку:

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

Оставив комментарий, я не могу собрать данные в формате XML, но в результате операторов печати я вижу все, что должен, на экране.

моя команда для вывода xml:

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

Я получаю создание XML-файла, когда Я ОБЕСПЕЧИВАЮ строку возвращаемую строку выше, но скрипт останавливается и не будет переходить по ссылкам.

Ответы [ 3 ]

4 голосов
/ 30 июня 2011

Вы возвращаете список элементов (вероятно, не в том месте) и позже в той же функции, которую вы используете yield для выдачи запросов. Вы не можете смешивать доходность и доходность в Python.

Либо добавьте все в список и верните его в конце метода разбора, либо используйте yield везде. Я предлагаю заменить items.append(item) на yield item и удалить все ссылки на список предметов.

3 голосов
/ 30 июня 2011

Отвечает ли это на ваш вопрос: 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()
1 голос
/ 01 июля 2011

Класс CrawlSpider использует метод Parse, поэтому вы должны назвать свой конкретный метод parse как-то иначе, например parse_item (). См. «Правила сканирования» http://doc.scrapy.org/topics/spiders.html#scrapy.spider.BaseSpider.

...