2021SC@SDUSC
这篇博客将讲述xpath,yield以及其他parse()代码的分析
parse()代码分析先放在下面
#python类中方法的定义,注意要带self
def parse(self, response):
#定义item
item = CnblogItem()
# 使用xpath搜索
# xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表
# extract(): 序列化该节点为unicode字符串并返回list
item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract()
item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract()
yield item
# offset的中文意思是偏移量。
# 在爬虫中,offset一般用于翻页
print("第{0}页爬取完成".format(self.offset))
if self.offset < 10: #爬取到第几页
self.offset += 1
url2 = self.url+str(self.offset) #拼接url
print(url2)
yield scrapy.Request(url=url2, callback=self.parse)
一.XPath简述
(先附上博主学习XPath的文档链接:XPath教程)
XPath简而言之就是对文档的元素和属性进行遍历的工具。
它使用路径表达式来遍历
比如:
/html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
/html/head/title/text(): 选择上面提到的 <title> 元素的文字
//td: 选择所有的 <td> 元素
//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素
下面附上几种经常用到的路径表达式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
XPath的谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。
比如:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
在函数parse()里的xpath语句就表示:
//a[@class="titlelnk"]/text()
找到所有具有 class="titlelnk" 属性的a标签元素的文字
//a[@class="titlelnk"]/@href
找到所有具有 class="titlelnk" 属性的a标签元素的链接
二.yield
(先附上博主学习yield的链接:python中yield的用法详解——最简单,最清晰的解释)
yield简而言之就是 return。它会返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。
三.其他关键代码分析
这两行代码:
item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract()
item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract()
分别用到了xpath()和extract()
xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。
extract(): 序列化该节点为unicode字符串并返回list。
简而言之就是xpath()可以执行xpath语句,选择一系列元素和属性;extract()将它们转化为文字。