主要包括以下四种解析方式:re解析、bs4解析、xpath解析、 pyquery解析
一、正则表达式
Regular Expression,正则表达式一种使用表达式的方式对字符串进行匹配的语法规则,语法是使用元字符进行排列组合用来匹配字符串,在线测试正则表达式网址:https://tool.oschina.net/regex/
元字符:具有固定含义的特殊符号
1 . 匹配换行符以外的任意字符
2 \w 匹配字母或数字或下划线 \W 匹配非字母或数字或下划线
3 \s 匹配任意的空白符 \S 匹配非空白符
4 \d 匹配数字 \D 匹配非数字
5 \n 匹配一个换行符
6 \t 匹配一个制表符
7 ^ 匹配字符串的开始
8 $ 匹配字符串的结尾
9 a|b 匹配字符a或b
10 () 匹配括号内表达式,也表示一个组
11 [...] 匹配字符组中的字符 [^...] 匹配除了字符组中字符的所有字符
量词:控制前面的元字符出现的次数
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m}重复n到m次
贪婪匹配和惰性匹配
.* 贪婪匹配
.*? 惰性匹配
二、re模块
import re
# result = re.findall("a", "ddsallakkksa")
# print(result) #['a', 'a', 'a']
# result = re.finditer(r"\d+", "我今年18岁,我有2000000块")
# for item in result: #从迭代器中拿到内容
# print(item.group()) #从匹配到的结果中拿到数据 18 2000000
#search只会匹配到第一次匹配的内容
# result = re.search(r"\d+", "我叫周杰伦,今年32岁,我的班级是3年2班") #<re.Match object; span=(8, 10), match='32'>
# print(result.group()) #32
#match,在匹配的时候是从字符串开头进行匹配的,类似于正则前面加上了^
result = re.match(r"\d+", "我叫周杰伦,今年32岁,我的班级是3年2班")
print(result) #None
#预加载,提前把正则对象加载完毕
obj = re.compile(r"\d+") #直接把加载好的正则进行使用
result = obj.findall("我叫周杰伦,今年32岁,我的班级是3年2班")
print(result) #['32', '3', '2']
三、bs解析
from bs4 import BeautifulSoup
html ="""
<ul>
<li><a href="zhangwuji.com">张无忌</a></li>
<li id="abc"><a href="zhouxingchi.com">周星驰</a></li>
<li><a href="zhubajie.com">猪八戒</a></li>
<li><a href="wuzetian.com">武则天</a></li>
</ul>
"""
#初始化BeautifulSoup对象
page = BeautifulSoup(html,"html.parser")
# page.find("标签名",attrs={"属性":"值"}) #查找某个元素只会找到一个结果
# page.find_all("标签名",attrs={"属性":"值"}) #查出一堆结果
li = page.find("li", attrs={"id": "abc"}) #<li id="abc"><a href="zhouxingchi.com">周星驰</a></li>
a = li.find("a") #<a href="zhouxingchi.com">周星驰</a>
print(a.text) #周星驰
print(a.get("href")) #zhouxingchi.com