课前说明:
网页解析工具有很多种,例如:re、xpath、jsonpath、bs4等等,本章节简单介绍一下re和xpath的用法,其它解析工具自行学习O(∩_∩)O哈!
本章节需要掌握的知识点:
re正则的使用
xpath的使用
re 详解:
import re
#
string = '''Hi girl!
Are you free tonight?
Let's go to play!
'''
# 1) 元字符
# 普通字符 字母 数字 下划线等 ascci 码表中可见的字符
# pat = r'o'
# ret = re.findall(pattern=pat, string=string)
# 非打印字符
# pat = r'\n'
# ret = re.findall(pattern=pat, string=string)
# 2) 通配符
# 用某些特殊字符串,来表示某一类字符
'''
\w 任意的字母、数字、下划线
\W 任意的非字母、数字、下划线
\d 数字
\D
\s 空白
\S
[abc] 匹配a、b或c
[a-e] 匹配 a-e 之间的任意一个字符
[^abc] 匹配除了abc之外的任意字符
'''
pat = r'[^abc]'
ret = re.findall(pattern=pat, string=string)
# 3)特殊字符
'''
. 任意字符
$ 以某某结束
+ 重复一次到多次
* 重复0多多次
? 至多重复1次
{m} 重复m次
'''
# pat = r'^H.+'
# ret = re.findall(pattern=pat, string=string)
# 4) 模式修正print(ret)
# 如果要进行模式修正,首先要用compile 将正则字符编译成正则对象
# pat = re.compile(r'^H.+!$', re.S)
# ret = pat.findall(string)
'''
re.I 忽略大小写
re.S 把多行字符串视为一行
re.M 把多行字符串拆成多个单行来匹配
'''
# # 贪婪于懒惰
# string = 'dfasdfa l apfdsafadsfpafpaasfdapaasfda'
# # pat = re.compile(r'.*pa') # 贪婪模式:按照规则一直寻找到最后一个符合规则字符为止
# pat = re.compile(r'.*?pa') # 懒惰模式:按照规则寻找到第一个符合就停止
# ret = pat.findall(string)
print(ret)
第一张图片是 re 比较常用的一些知识点:
xpath详解:
from lxml import etree
# lxml 这个框架用于对xml 文件进行格式化操作(说明:HTML是一种特殊的xml文件)
# xpath 是一种在XML中,根据文档的结构来提取目标元素和属性的语法,它的基础库就是lxml
# etree 的作用就是把HTML 字符串用一个树型结构来表现出来,也成为节点树
# 1、用 etree 把HTML 加载进来,并且创建出一颗节点树
# 加载本地文件
html_tree = etree.parse('./test.html')
# 2、获取节点 获取test文件中第一个li
# ret = html_tree.xpath('/html/body/ol/li[1]/text()')
# print(ret)
# xpath方法可以根据xpath 语法把符合语法的所有的节点对象放在列表中返回
# ret = html_tree.xpath('/html/body/div/div[1]/a')
# 3、获取属性和内容
# ret = html_tree.xpath('/html/body/ol/li[2]/text()') # 获取节点中的文本内容
# ret = html_tree.xpath('/html/body/div/div[2]/a/@href') # 获取节点的某个属性
# 4、定位
# 1)层级定位
# 查找页面上所有的li
# ret = html_tree.xpath('//li/text()') # 在xpath语法中,/ 代表两层节点中间只相隔一层, // 代表相隔若干层
# ret = html_tree.xpath('//ol//@class')
# 2)属性定位
# 查找页面上所有带id属性的li
# ret = html_tree.xpath('//li[@id]/text()')
# 查找页面上所有的class值为dudu的li
# ret = html_tree.xpath('//li[@class="dudu"]/text()')
# 注意:xpath 中一定要把要查找的属性值写全
# ret = html_tree.xpath('//li[@class="hehe jj]/text()"')
# 5、模糊匹配
# 查找所有的class值中包含 he 的li
# ret = html_tree.xpath('//li[contains(@class, "he")]/text()')
# 查找所有的class值以 h 开头的li
# ret = html_tree.xpath('//li[starts-with(@class, "h")]/text()')
# 6、逻辑匹配
# 与:查找所有的包含有id属性并且含有class 的那些li
# ret = html_tree.xpath('//li[@id="hh" and @class]')
# 或:查找id 属性为hh,class 属性为name的 li
# ret = html_tree.xpath('//li[@id="hh" or @class="name"]')
# print(ret)
第二张图是 xpath 常用的知识点,结合这些知识点基本能解析所有的页面
温馨提示:多动手动脑才能记得住哦n(*≧▽≦*)n!