鱼C论坛

 找回密码
 立即注册
查看: 1321|回复: 7

[已解决]scrapy爬虫里xpath的一个问题

[复制链接]
发表于 2018-2-5 02:57:56 | 显示全部楼层 |阅读模式

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

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

x
大家好!我又来问问题了!这次遇到的问题是这样哒。在我爬虫的时候,xpath分段或者不分段时,我 打印出来的结果时不同的,但是我并不知道为什么。请看下面的例子:
  1. import scrapy


  2. class DmozSpider(scrapy.Spider):
  3.     name = 'dmoz'
  4.     allowed_domains = ['chinadmoz.org']
  5.     start_urls = [
  6.         'http://www.chinadmoz.org/subindustry/8/'
  7.         ]

  8.     def parse(self,response):
  9.         title = response.xpath('//ul/li/div')
  10.         for ti in title:
  11.             a = ti.xpath('h4/a/text()').extract()
  12.             print(a)
复制代码

请看一下parse这个方法里的代码,此时我打出来的结果请看一下第一张图。
但是在另一个代码中:
  1.     def parse(self,response):
  2.         title = response.xpath('//ul/li/div/h4/a/text()').extract()
  3.         for ti in title:
  4.             print(ti)
复制代码

得出来的结果却是如图二所示。我想请问一下,如果我想要用图一方式写代码,又想得到像图二一样漂亮的输出结果,应该怎么做呢?
十分感谢!!!!

最佳答案
2018-2-5 10:50:26
本帖最后由 la_vie_est_bell 于 2018-2-5 13:54 编辑

title = response.xpath('//ul/li/div')

上面这行代码选中的有两个div元素

有两个div元素

有两个div元素


而第一个div元素下面没有h4

这就是为什么图一中有空列表输出。

所以应该改成title = response.xpath('//ul/li/div[2]')以此来选中第二个div元素。

那为什么会输出列表而不是像图二中直接输出字符串呢?

需要知道Selector和SelectorList的区别,对前者使用extract()会返回字符串,而对SelectorList使用extract()会返回列表:

title = response.xpath('//ul/li/div[2]') 返回SelectorList对象

for ti in title: 选中SelectorList对象中每一个Selector

a = ti.xpath('h4/a/text()').extract() 这句话是关键,ti.xpath('h4/a/text()')该部分返SelectorList对象,所以使用extract()会返回List。

应该改成a = ti.xpath('h4/a/text()').extract_first() 来选中字符串。

第一段代码得到的结果

第一段代码得到的结果

第二段代码输出结果

第二段代码输出结果
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-5 02:58:48 | 显示全部楼层
我才发现小甲鱼的论坛,鱼币还要收税的。。。我真是,,墙都不服就服鱼C了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 10:50:26 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +10 鱼币

本帖最后由 la_vie_est_bell 于 2018-2-5 13:54 编辑

title = response.xpath('//ul/li/div')

上面这行代码选中的有两个div元素

有两个div元素

有两个div元素


而第一个div元素下面没有h4

这就是为什么图一中有空列表输出。

所以应该改成title = response.xpath('//ul/li/div[2]')以此来选中第二个div元素。

那为什么会输出列表而不是像图二中直接输出字符串呢?

需要知道Selector和SelectorList的区别,对前者使用extract()会返回字符串,而对SelectorList使用extract()会返回列表:

title = response.xpath('//ul/li/div[2]') 返回SelectorList对象

for ti in title: 选中SelectorList对象中每一个Selector

a = ti.xpath('h4/a/text()').extract() 这句话是关键,ti.xpath('h4/a/text()')该部分返SelectorList对象,所以使用extract()会返回List。

应该改成a = ti.xpath('h4/a/text()').extract_first() 来选中字符串。

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

使用道具 举报

 楼主| 发表于 2018-2-6 00:14:52 | 显示全部楼层
la_vie_est_bell 发表于 2018-2-5 10:50
title = response.xpath('//ul/li/div')

上面这行代码选中的有两个div元素

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

使用道具 举报

发表于 2018-3-2 09:59:39 | 显示全部楼层

回帖奖励 +10 鱼币

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

使用道具 举报

发表于 2018-3-9 23:00:19 | 显示全部楼层

回帖奖励 +10 鱼币

刚好遇到这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 06:28:00 | 显示全部楼层

回帖奖励 +10 鱼币

我也是,遇到 这个问题了。。。。大神来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 07:38:06 | 显示全部楼层

回帖奖励 +10 鱼币

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-7 09:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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