在网络爬虫中,通过模拟请求并得到含有目标数据的响应,此时需要将数据匹配/定位出来,在之前介绍网络爬虫基础中,介绍过可以有两种思路将数据从HTML源码中提取出来,第一种是将包含数据的HTML当做一个长长的字符串,然后定位到目标数据。另一种是利用HTML的层次型数据的特性对其进行定位。这里将介绍一些常用的网络爬虫中使用到的数据匹配方法。
1.Regex正则表达式
正则表达式:又称正规表示法、常规表示法,它是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。几乎在各种计算机编程语言中都有用到。可以分为普通正则表达式、扩展正则表达式、高级正则表达式。
更简单的理解:正则表达式定义了一个匹配子串的模板,并能根据这个模板把一个长串中满足该模板条件的子串提取出来。


上图就是利用正则表达式将字符串中<div>标签中的文本元素匹配出来的过程,以下是常用的正则表达式匹配字符方式。包括普通字符、非打印字符、特殊字符、限定符、定位符等。





正则表达式中有一个特殊用法,就是贪婪匹配/懒惰匹配,即在符合正则表达式的情况下,匹配字段尽可能长(贪婪)或是尽可能短(懒惰)。

常用的正则表达式方法如下。

2.CSS Selector
第二种方法是使用CSS选择器,这个是由于网络爬虫针对的目标对象是网页,可以根据目标数据所在的标签去进行访问,通常这些标签都会有一个属性“class”,可右键检查,查看其class值,然后用CSS选择器进行定位。CSS选择器用于选择你想要的元素的样式的模式。”CSS”列表示在CSS版本的属性定义(CSS1,CSS2,或对CSS3),常用的CSS选择器如下。




举个例子,针对下图的HTML结构:
.totalvideo是class=“totalvideo”的元素
.info > a是class=“info”的元素下的<a>标签
#10001是id=“10001”的元素
#1 >a::text是id=“1”的元素下的<a>标签的文本元素
.info > a::attr(href)是class=“info”的元素下的<a>标签的href属性值

3.xpath
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快地被开发者采用来当作小型查询语言。它的用法很像CSS Selector。


xml.xpath(“bookstore”) 表示选取 bookstore 元素的所有子节点
xml.xpath(“/bookstore”) 表示选取根元素 bookstore。
xml.xpath(“bookstore/book”) 选取属于 bookstore 的子元素的所有 book 元素。
xml.xpath(“//book”) 选取所有 book 子元素,而不管它们在文档中的位置。
xml.xpath(“bookstore//book”) 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
xml.xpath(“//@lang”) 选属性名为 lang 的所有元素。





4.其他方法
除了使用正则表达式对字符串进行匹配以外,常常还会使用到字符串的一些方法,例如python中的str.replace()方法、str.strip()方法等。
有时可以直接获取response的json字符串,或网页提供公共接口API中本身就是以json字符串保存时,可以直接对json字符串进行解析,可以使用python json库完成。