Python - for循环,它产生的抓取数据每页只循环一次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - for循环,它产生的抓取数据每页只循环一次相关的知识,希望对你有一定的参考价值。

我正在使用web crawler scrapy并将数据加载到csv文件中。我正在使用xpath,并且遇到了正确加载我的数据的问题,我认为这源于我的for循环中的错误。它仅从每个页面中提取第一个标题,作者和引用,从而生成三行csv文件。这是我第一次使用python,我正在努力正确实现枚举/ zip函数。

import scrapy
class MySpider(scrapy.Spider):
name = 'test'
custom_settings = {
    'FEED_FORMAT': 'csv',
    'FEED_URI': 'test.csv'
}
start_urls = [
    'http://quotes.toscrape.com/', 
    'http://quotes.toscrape.com/page/2/',
    'http://quotes.toscrape.com/page/3/'
]
def parse(self, response):
    titles =  response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract()
    authors = response.xpath("//small[contains(@class, 'author')]/text()").extract()
    quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract()
    for i, (title, author, quote) in enumerate(zip(titles, authors, quotes)):
        yield {'index': i, 'title': title, 'author': author, 'quote': quote}
答案

这里的问题是zip只创建与作为参数传递的最小列表相同数量的元素,在这种情况下titles只包含1元素,因此for只会迭代一次是正确的。

如果你想要所有元素的相同标题,你应该只迭代authorsquotes

title =  response.xpath("//div[contains(@class, 'col-md-4')]/h2/text()").extract_first()
authors = response.xpath("//small[contains(@class, 'author')]/text()").extract()
quotes = response.xpath("//div[contains(@class, 'quote')]/span[contains(@class, 'text')]/text()").extract()
for i, (author, quote) in enumerate(zip(authors, quotes)):
    yield {'index': i, 'title': title, 'author': author, 'quote': quote}

以上是关于Python - for循环,它产生的抓取数据每页只循环一次的主要内容,如果未能解决你的问题,请参考以下文章

在for循环中将Dataframes附加在一起

python 利用 for ... else 跳出双层嵌套循环

python 利用 for ... else 跳出双层嵌套循环

queryList 一次抓取多个网页内容的方法--目前只有用循环 替换页码或者给出url循环进行 queryList没有像python一样的yied迭代方法 queryList 实现多个实例抓取

我想抓取一个页面没有变化但每个表的页面中的数据每页都变化的网站

Python:循环参数