在练习Python的Scrapy模组时遇到的问题:
将循环爬到的结果用一个个item对象储存,之后插入一个列表
sites=sel.xpath('//div[@class="course-list"]/div[@class="list max-1152 clearfix"]')
#print(sites)
items=[]
for site in sites:
item=TutorialItem()
item['vid_name']=site.xpath('a/@data-title').extract()
item['vid_addr']=site.xpath('a/@href').extract()
items.append(item)
#print(vid_name,vid_addr)
print(site.extract())
return items
但是运行完成后的JSON文件内容结果却和预想的不一样
预想时:[ {vid_name : name1, vid_addr : addr1}, {vid_name : name2, vid_addr : addr2},{vid_name : name3, vid_addr : addr3}] 这样的成员为字典的列表
实际上是: { vid_name : [name1,name2, name3], vid_addr : [addr1, addr2, addr3}
求解惑为什么会这样,空列表是定义在循环外,对象定义声明都在循环内,插入列表的方法也在循环内,为什么会造成这样的结果,该怎么修复这个问题
完整代码:
ImoocSpider.py:
import scrapy
from tutorial.items import TutorialItem
class TutorialSpider(scrapy.Spider):
name='Imooc'
allowed_domains=['DOMAIN'] #平台不方便打URL链接
start_urls=['URL'] #但是抓取的部分没问题,数据都对的
def parse(self,response):
sel=scrapy.selector.Selector(response)
#print(sel)
sites=sel.xpath('//div[@class="course-list"]/div[@class="list max-1152 clearfix"]')
#print(sites)
items=[]
for site in sites:
item=TutorialItem()
item['vid_name']=site.xpath('a/@data-title').extract()
item['vid_addr']=site.xpath('a/@href').extract()
items.append(item)
#print(vid_name,vid_addr)
print(site.extract())
return items
items.py:
import scrapy
class TutorialItem(scrapy.Item):
vid_name=scrapy.Field()
vid_addr=scrapy.Field()
site.xpath('a/@data-title').extract()的extract()获取的是一个结果列表,用extract_first()或site.xpath('a/@data-title').extract()[0]获取第一个元素。
你print的是site,又不是items,你这是拿勺尝汤,往锅里撒盐啊
因为你的 sites 列表中只有一个 div 元素, for site in sites 只遍历了一次,这个 div 下的有多个 a 标签,你的 xpath 自然就返回这多个 a 标签的 href 组成的列表,即:
{vid_addr: [href1, href2, href3]}