欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《精通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)
相关标签: Scrapy 爬虫