《精通Scrapy网络爬虫》第三章
程序员文章站
2022-05-09 22:56:33
...
Selector对象
从页面中提取数据的核心技术是HTTP文本解析,在Python中常用Beautiful和lxml模块处理此类问题。Scrapy综合上述两者优点实现了Selector类,它是基于lxml库构建的。Selector类的实现位于scrapy.selector
模块。
Selector的使用:
创建对象
创建Selector对象时,有两种方法,一是可将页面的HTML文档字符串传递给Selector构造方法的text参数,,例如:selector = Selector(text=text)
二是使用一个Response对象构造Selector对象,将其传递给Selector构造器方法的response参数,例如:
response = HtmlRespone(url='http://www.example.com',body=body,encoding='utf-8')
selector = Selector(response=response)
选中数据
调用Selector对象的xpath方法或css方法会返回SelectorList对象,SelectorList支持列表接口,可用for语句迭代访问其中的每一个Selector对象。
selector_list = selector.xpath('//h1')
for sel in selector_list:
print(sel.xpath('./text()'))
提取数据
调用Selector或者SelectorList对象的以下方法可将选中的内容提取:
- extract()
- re()
- extract_first() (SelectorList专有)
- re_first() (SelectorList专有)
在实际开发中,我们直接使用Response对象内置的Selector对象。Response对象还提供了xpath和css方法,它们在内部分别调用内置Selector对象的xpath和css方法,可使用快捷方式。
response.xpath('.//h1/text()').extract()
response.css('li::text').extract()
XPath
XPath即XML路径语言,它是一种用来确定xml文档中某部分位置的语言。
xml文档的节点有多种类型,最常用的如下:
- 根节点
- 元素节点 html、body、div、p、a
- 属性节点 href
- 文本节点 helloworld、Click here
节点间的关系:
- 父子
- 兄弟
- 祖先、后裔
基础语法
表达式 | 描述 |
---|---|
/ | 选中文档的根 |
. | 选中当前节点 |
… | 选中当前节点的父节点 |
ELEMENT | 选中子节点中所有ELEMENT元素节点 |
//ELEMENT | 选中h后代节点中所有ELEMENT元素节点 |
* | 选中所有元素子节点 |
text() | 选中所有文本子节点 |
@ATTR | 选中名为ATTR的属性节点 |
@* | 选中所有属性节点 |
[谓语] | 谓语用来查找某个特定的节点或者包含某个特定值的节点 |
常用函数
- position():选中位置大于或者小于或者等于某个值的节点
- last():选中最后一个
- string(arg):返回参数的字符串值
- contains(str1,str2):判断str1中是否包含str2,返回布尔值
CSS选择器
CSS即层叠样式表,其 选择器是一种用来确定HTML文档中某部分位置的语言。
基本语法
表达式 | 描述 |
---|---|
* | 选中所有元素 |
E | 选中E元素 |
E1,E2 | 选中E1和E2元素 |
E1 E2 | 选中E1后代元素中的E2元素 |
E1>E2 | 选中E1子元素中的E2元素 |
E1+E2 | 选中E1兄弟元素中的E2元素 |
.CLASS | 选中CLASS属性包含CLASS的元素 |
#ID | 选中id属性为ID的元素 |
[ATTR] | 选中包含ATTR属性的元素 |
[ATTR=VALUE] | 选中包含ATTR属性且值为VALUE的元素 |
[ATTR~=VALUE] | 选中包含ATTR属性且值包含VALUE的元素 |
E:nth-child(n)(E:nth-last-child(n)) | 选中E元素,且该元素必须是其父元素的(倒数)第n个子元素 |
E:first-child(E:last-child) | 选中E元素,且该元素必须是其父元素的(倒数)第一个子元素 |
E:empty | 选中没有子元素的E元素 |
E::text | 选中E元素的文本节点(Text Node) |