本文主要介绍了Scrapy常用的数据提取的方法,包括seletors、scrapy shell、xpath、css、BeautifulSoup的使用方法及案例。只要掌握xpath或者css任意一种即可。
1、seletors选择器
1)介绍
Scrapy提取数据有自己的一套机制。它们被称作选择器(seletors),构建于lxml库之上,通过特定的XPath或者CSS表达式来等“选择” HTML文件中的某个部分。Selector有四个基本的方法,最常用的还是xpath:
XPath(query):传入Xpath表达式queery,返回该表达式对应的所有节点的selector list。Xpath是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
css(query):传入css表达式query,返回该表达式所对应的所有节点的selector list列表CSS是将HTML文档样式化的语言。选择器由它定义,并与特定的HTML元素的样式相关联。
re(): 根据传入的正则表达式对数据进行提取,返回Unicode字符串list列表
extract(): 序列化该节点为Unicode字符串并返回list
2)导入seletors
from scrapy.selector import Selector, HtmlXPathSelector
from scrapy.http import HtmlResponse
3)常用xpath使用方法:
常用语法:
/:根节点
//xxx/zzz:路径
//div:去全局的子孙中找所有的div元素
.//表示去当前对象的子孙中找
/xxx//div:去儿子对象中找xxx节点下所有的div元素
*:匹配任意节点元素
/html/body/div[1]:选取body下的第一个div节点
//div[@class="xxx"]:选取class属性为xxx的div节点
//@attr:获取attr对应的值
常用函数:
text():提取文本信息,//*[@class='xxx']/text()
position():选取第几个节点,//*[position()=1]
last():选取最后一个节点,//*[last()]
starts-with(@attr,substr):attr属性值开头substr的节点
contains(@attr,substr):attr属性值是否包含substr
运算符:
|:计算两个节点集合,比如//div|//li
比较运算符=,!=,<=...,比如//price[text()>10]
算数运算符:+,-,*,div,比如//price[text()+1]
逻辑运算符:or,and,[@class='xxxx' or @class='yyyy']
4)xpath语法案例:以取a标签为案例,div、span等都相同
xpath('//a'):找到全局中所有的a标签
xpath('//a/text() '):获取a标签的文本值
xpath('//a/span'):a标签对象儿子下的span标签
xpath('//a[2]'):a标签找到后,返回的是一个列表,[n]列表的n位置的值
xpath('//a[@id]'):找全局中属性为id的a标签
xpath('//a[@id="i1"]'):找全局中属性id为i1的a标签
xpath('//a/@id'):取a标签的id的属性值
xpath('//a[@href="link.html"][@id="i1"]'):两个[]代表双条件,需要href="link.html“,且id="i1"的a标签
xpath('//a[contains(@href, "link")]'):a标签的href需要包含"link"字符
xpath('//a[starts-with(@href, "link")]'):a标签的href需要以"link"开头
xpath('//a[re:test(@id, "i\d+")]'):正则表达式的写法,需要有re:test
xpath('//a[re:test(@id, "i\d+")]/@href').extract(),正则表达式的写法案例
xpath(.//)在当前基础上往下找,需要加“.”,比如用在for循环中
obj.extract()#列表中的每一个对象转化字符串==>返回一个列表
obj.extract_first() #列表中的每一个对象转化字符==>列表中的第一个元素
xpath('/html/body/ul/li/a/@href').extract():一层层去找标签
5)获取代码,需要在页面,右键-----检查元素---去看下html结构。
也可以直接选择自己想要的内容,通过copy---copy xpath直接获得源代码,去粘贴即可。
比如选取下面页面的肖申克救赎的信息:但一般这种路径都会特别长。
//*[@id="content&