Python网络爬虫之数据解析方式
正则解析
单字符:
. : 除换行以外所有字符
[] :[aoe] [a-w] 匹配集合中任意一个字符
\d :数字 [0-9]
\D : 非数字
\w :数字、字母、下划线、中文
\W : 非\w
\s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S : 非空白
数量修饰:
* : 任意多次 >=0
+ : 至少1次 >=1
? : 可有可无 0次或者1次
{m} :固定m次 hello{3,}
{m,} :至少m次
{m,n} :m-n次
边界:
$ : 以某某结尾
^ : 以某某开头
分组:
(ab)
贪婪模式 .*
非贪婪(惰性)模式 .*?
re.I : 忽略大小写
re.M :多行匹配
re.S :单行匹配
re.sub(正则表达式, 替换内容, 字符串)
xpath解析
from lxml import etree
两种方式使用:将html文档变成一个对象,然后调用对象的方法去查找指定的节点
(1)本地文件
tree = etree.parse(文件名)
(2)网络文件
tree = etree.HTML(网页字符串)
ret = tree.xpath(路径表达式)
【注】ret是一个列表
参考文献:http:
- 常用表达式:
/bookstore/book 选取根节点bookstore下面所有直接子节点book
//book 选取所有book
/bookstore//book 查找bookstore下面所有的book
/bookstore/book[1] bookstore里面的第一个book
/bookstore/book[last()] bookstore里面的最后一个book
/bookstore/book[position()<3] 前两个book
//title[@lang] 所有的带有lang属性的title节点
//title[@lang='eng'] 所有的lang属性值为eng的title节点
属性定位
//li[@id="hua"]
//div[@class="song"]
层级定位&索引
//div[@id="head"]/div/div[2]/a[@class="toindex"]
【注】索引从1开始
//div[@id="head"]//a[@class="toindex"]
【注】双斜杠代表下面所有的a节点,不管位置
逻辑运算
//input[@class="s_ipt" and @name="wd"]
模糊匹配 :
contains
//input[contains(@class, "s_i")]
所有的input,有class属性,并且属性中带有s_i的节点
//input[contains(text(), "爱")]
starts-with
//input[starts-with(@class, "s")]
所有的input,有class属性,并且属性以s开头
取文本
//div[@id="u1"]/a[5]/text() 获取节点内容
//div[@id="u1"]//text() 获取节点里面不带标签的所有内容
取属性
//div[@id="u1"]/a[5]/@href
- 代码中使用xpath:
1.导包:from lxml import etree
2.将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
2.1 本地文件:tree = etree.parse(文件名)
2.2 网络数据:tree = etree.HTML(网页内容字符串)
- 综合练习:
需求:获取好段子中段子的内容和作者 http:
from lxml import etree
import requests
url='http://www.haoduanzi.com/category-10_2.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
url_content=requests.get(url,headers=headers).text