鱼C论坛

 找回密码
 立即注册
查看: 3160|回复: 4

[已解决]scrapy爬取数据后存为csv格式数据有重复

[复制链接]
发表于 2017-4-6 16:26:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近爬取了拉勾网的招聘信息存为csv格式。
需要的信息都已经爬取到了 但是存为csv格式之后打开表格出现这样的情况:

1.png

desc下的信息每一行都分开了  然后相应的公司名字和其他信息就重复了

我爬取desc部分代码如下:
  1. def parse2(self,response):
  2.         item = response.meta['item']
  3.         lis = response.xpath('//*[@id="job_detail"]/dd[2]/div')
  4.         for li in lis:
  5.             item['desc'] = li.xpath('p/text()').extract()
  6.         yield item
复制代码

网页源码如下,文字部分存放在<p>里

2.png

然后我写的代码是爬取 p标签下的文本,这样好像每一个p标签就会生成一个数据...最后结果就成那样了..
如果我想只在一个desc下包含同一公司招聘信息所有的内容,应该怎么修改那个代码呢..
开始打算用append..加进去,先全部把数据保存到一个地方,最后存到item['desc']中,改成下面这样。

  1. def parse2(self,response):
  2.         item = response.meta['item']
  3.         lis = response.xpath('//*[@id="job_detail"]/dd[2]/div')
  4.         middle=[]
  5.         for li in lis:
  6.             middle.append() = li.xpath('p/text()').extract()
  7.         item['desc'] = middle
  8.         yield item
复制代码


但是报错了 0 0.

  1.     middle.append() = li.xpath('p/text()').extract()
  2.                ^
  3. SyntaxError: can't assign to function call
复制代码


求指导,还是有什么别的办法吗...
最佳答案
2017-4-6 17:00:58
middle.append() = li.xpath('p/text()').extract()
我不知道你这种写法是不是什么高级玩法
如果我没记错的话,这个li.xpath('p/text()').extract()得到的应该是一个列表吧?
如果是列表那就改成这样:
  1. middle.extend(li.xpath('p/text()').extract())
复制代码

如果是字符串那就改成这样:
  1. middle.append(li.xpath('p/text()').extract())
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-4-6 17:00:58 | 显示全部楼层    本楼为最佳答案   
middle.append() = li.xpath('p/text()').extract()
我不知道你这种写法是不是什么高级玩法
如果我没记错的话,这个li.xpath('p/text()').extract()得到的应该是一个列表吧?
如果是列表那就改成这样:
  1. middle.extend(li.xpath('p/text()').extract())
复制代码

如果是字符串那就改成这样:
  1. middle.append(li.xpath('p/text()').extract())
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-6 17:57:04 | 显示全部楼层
还有一个建议,在你保存到CSV中之前,先把你提取到的信息中英文逗号替换成中文逗号,因为CSV默认是按照英文逗号分列的,如果你不替换,那分列会比你预想的乱
还有\n换行符也是没用的,直接替换掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-7 13:52:50 | 显示全部楼层
gopythoner 发表于 2017-4-6 17:00
middle.append() = li.xpath('p/text()').extract()
我不知道你这种写法是不是什么高级玩法
如果我没记错 ...

谢谢你 不过我两种方法都试了一下 li.xpath('p/text()').extract()得到的的确是个列表
用middle.extend之后也能出来结果 不过好像是跟之前没改过的效果一样 ,在csv表格中还是每一列只显示一行
然后我去百度了下
  1. lis = response.xpath('//*[@id="job_detail"]/dd[2]/div')
  2.         item['desc'] = lis.xpath('string(.)').extract()[0]
复制代码

用这样的方法就能得到我想要的结果 ,把所有的字符串都放到同一个item里。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-7 13:54:32 | 显示全部楼层
gopythoner 发表于 2017-4-6 17:57
还有一个建议,在你保存到CSV中之前,先把你提取到的信息中英文逗号替换成中文逗号,因为CSV默认是按照英文 ...

这个替换的没太看明白呃..我之前的列表数据都是按照源代码页中一行一行抓取下来的,没有乱,就是抓到的每一行完整的数据都自成一列 。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-26 17:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表