我正在通过Scrapy学习网页抓取。我一直卡在如下问题上:
为什么CSV文件在一行中打开整个数据?确实它应该有8行和4列。它是可以与列,但我不明白为什么它只在一行中打开数据。
import scrapy
class MyredditSpider(scrapy.Spider):
name = 'myreddit'
allowed_domains = ['reddit.com']
start_urls = ['http://www.reddit.com/']
#custom_settings = {
#"FEEDS":{"result.csv":{"format":"csv",}}
#}
def parse(self, response):
all_var=response.xpath("//div[@class='rpBJOHq2PR60pnwJlUyP0']")
for variable in all_var:
post= variable.xpath("//h3[@class='_eYtD2XCVieq6emjKBH3m']/text()").extract()
vote= variable.xpath("//div[@class='_1rZYMD_4xY3gRcSS3p8ODO _3a2ZHWaih05DgAOtvu6cIo ']/text()").extract()
time=variable.xpath("//span[@class='_2VF2J19pUIMSLJFky-7PEI']/text()").extract()
links= variable.xpath("//a[@data-click-id='body']/@href").extract()
yield{"Posts": post, "Votes": vote, "Time": time, "Links":links}
我用scrapy crawmyreddit-o items.csv将数据保存在csv中。我想得到CSV,每行中的每个值都是相应的。几乎像在图像中一样
3条答案
按热度按时间kmynzznz1#
您的代码看起来不错,并且完全按照预期工作。
yield
是一个单行术语。每当您在代码中使用yield作为输出时,它都将被视为单行。下面的示例将输出两行。1tuwyuhd2#
这是因为这是你提取信息的方式...
每个
extract()
调用都是一次提取页面上的所有元素,如果你想让它们一行一行地列出,你也会想一行一行地迭代html元素。例如,它应该更接近于这样的情况,即它遍历每一行,从每一行中提取信息并产生信息,然后移动到下一行。
e0bqpujr3#
可能是因为分隔符参数不正确而将整个数据表打开为一个数据表。
delimiter
的default参数设置为","
,并用逗号分隔数据。请记住,如果擦除的数据包含逗号,滑动过程将导致出现不需要的列。
在这种情况下,您可以使用
"|"
或"\t"
之类的字符作为分隔符。另一方面,问题可能出在
lineterminator
参数上,该参数指示每行数据应该如何终止。此参数的默认值为"\r\n"
。如果您的数据不使用这些字符
lineterminators
,您可以使用其他字符,如"\n"
,以确保数据被分隔到不同的行中。请参见以下示例: