Python 2.7 Scrapy:无法以正确的格式获取输出文件

Python 2.7 Scrapy:无法以正确的格式获取输出文件,python-2.7,web-scraping,scrapy,Python 2.7,Web Scraping,Scrapy,我将以连续数据的形式获取输出,而不是以正确的记录格式(每行一条记录)显示。以下是我的代码: import scrapy from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractor class famousPeopleItem(scrapy.Item): # define the fields for your item here like:

我将以连续数据的形式获取输出,而不是以正确的记录格式(每行一条记录)显示。以下是我的代码:

import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
class famousPeopleItem(scrapy.Item):
# define the fields for your item here like:
    Name = scrapy.Field()
    Profession = scrapy.Field()
    Birth_Date = scrapy.Field()
    Birth_Place = scrapy.Field()
    Nationality = scrapy.Field()
    Died_On = scrapy.Field()
    # item class included here 
    class famousPeople(CrawlSpider):
    name = 'famous'
     start_urls = [
       'http://www.thefamouspeople.com/famous-people-by-zodiac-sign.php'
        ]
     custom_settings = {
           'DEPTH_LIMIT': '1',
       }
    rules = (
      Rule(LinkExtractor(restrict_xpaths=
     ('//div[@class="table_list"]//a',)),callback='parse_item',follow=True),
    )
    def parse_item(self, response):
     item = famousPeopleItem()
     item["Name"] = 
     response.xpath('//div[@class="section"]//a[2]//text()').extract()
     item["Profession"] = 
     response.xpath('//div[@class="section"]//span//text()').extract()
     item["Birth_Date"] = 
     response.xpath('//div[@class="section"]//p[1]//text()').extract()
     item["Birth_Place"] = 
     response.xpath('//div[@class="section"]//p[2]//text()').extract()
     item["Nationality"] = 
     response.xpath('//div[@class="section"]//p[3]//text()').extract()
     item["Died_On"] = 
     response.xpath('//div[@class="section"]//p[4]//text()').extract()
     yield (item)

虽然extract_first()有助于以适当的格式提供数据,但它不会获取所有记录。

要获取每行一条记录,您需要每人生成一项

目前,您会生成一个(大)项,其中所有数据都会被提取到字段中。这是因为XPath选择器跨越页面上的所有人

response.xpath('//div[@class=“section”]”)不同
您需要一个跨越单个人员的选择器。在html代码中搜索合适的标记。看起来
tile
更有前景

然后,您应该循环使用新的
选择器
,并以点开始,使您的项目相对于父选择器进行XPath。最终每人生产一件物品

伪代码如下所示:

def parse_item(self, response):
    sel_persons = response.xpath('//div[@class="tile"]')
    for sel_person in sel_persons:
        # ...
        item['Name'] = sel_person.xpath('.//a[2]//text()').extract_first()
        # ...
        yield item
另请参见scrapy的文档,章节

extract()
以(unicode)字符串列表的形式返回刮取的数据。如果需要所有数据,而不仅仅是第一个元素,可以将结果合并为一个字符串,如下所示:

SEPARATOR = ' '

item["Name"] = SEPARATOR.join(response.xpath('//div[@class="section"]//a[2]//text()').extract())
# ... and so on
(我在这里假设,只需要一个空格就可以将各个部分分开——如果像“|”或“,”这样的分隔符更适合您的目的,请调整它)


如果您想执行更复杂的提取操作,如过滤特定片段、剥离等,我建议您查看Scrapy的项目加载程序:

如何显示输出?在csv文件中,每行一条记录。