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