- 1. 正则表达式
- 2. XPath
- ——-Xpath解析步骤——-
- 1.导入模块
- 2.实例化etree对象
- -01.调用本地HTML数据
- -02.调用网络HTML数据
- 3.Xpath语法
- 01.定位
- - /:表示从根节点开始定位,一个/表示一个层级
- - ./:表示当前层级
- - //:表示从任意位置开始定位
- - 属性定位:标签名[@属性名=”属性值”]
- - 定位某个字符开头属性名的标签:starts-with()
- - 定位属性值包含部分相同属性名的标签:contains()
- - 选取前几个或者后几个标签:position()
- - 索引定位:标签名[索引] 注意这里的索引从1开始
- 02.获取数据
- - 获取文本:text()
- - 获取属性:@属性名
- ———bs4解析步骤——-
- 1.导入模块
- 2.实例化BeautifulSoup对象
- 3.bs4语法
- 01.定位
- - soup.TagName:返回第一个标签对象
- - soup.find(‘TagName’):返回第一个标签对象
- - soup.find(‘TagName’, 属性名=’值’):返回第一个此属性的对象
- - soup.find_all():返回所有符合要求的对象(列表)
- - soup.select(‘选择器/层级选择器’):返回所有符合要求的对象(列表)
- 02.获取数据
- - 获取标签之间的文本数据
- - soup.TagName.text/get_text():可以获取一个标签中所有的文本内容
- - soup.TagName.string:只可以获取该标签下面直系的文本内容
- - 获取标签中属性值
- soup.TagName[‘属性名’]
数据解析的原理:
- 标签定位
- 提取标签、标签属性中储存的值
1. 正则表达式
基本符号
·
:表示除换行之外所有字符,仅表示单个字符
如:”regular” 可以表示为re...ar
*
:表示前一个表达式0次或无限次?
:表示前一个表达式0次或1次\d
:digital-表示一位数字()
:提取括号里的内容“.*”
:贪婪模式,获取最长的满足条件的字符串。“.*? ”
:非贪婪模式,获取最短的能满足条件的字符串。
findall()
re.findall(pattern, string, flags=0)# pattern:模式
以列表形式返回所有满足要求的字符串,如果没有匹配到结果,就会返回空列表
多个“(.*? )
”返回的仍然是一个列表,但是列表里面的元素变为了元组
re.findall('账号是:(.*?), 密码是:(.*?)', text, re.S)
>>>[('kingname', '123456'), ('shin', '27743')...]
search()
只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。
匹配成功,则是一个正则表达式的对象;如果没有匹配到任何数据,就是None。
通过.group()这个方法来获取里面的值,.group()里面的参数为1表示读取第1个括号中的内容,参数为2表示读取第2个括号中的内容,以此类推
2. XPath
XPath解析原理:
- 实例化一个etree的对象并将要解析的数据加载
- 调用etree对象中的XPath方法结合XPath表达式实现标签的定位和内容的捕获
环境安装
pip install lxml
语法
```python——-Xpath解析步骤——-
1.导入模块
from lxml import etree
2.实例化etree对象
-01.调用本地HTML数据
tree = etree.parse(filePath)
-02.调用网络HTML数据
tree = etree.HTML(response.text)
3.Xpath语法
01.定位
- /:表示从根节点开始定位,一个/表示一个层级
tree.xpath(‘/html’) # html根标签
- ./:表示当前层级
tree.xpath(‘./a’) # 当前层级下的a标签
- //:表示从任意位置开始定位
tree.xpath(‘//div/a’) # div下的a标签
- 属性定位:标签名[@属性名=”属性值”]
tree.xpath(‘//div/a[@class=’nav’])
- 定位某个字符开头属性名的标签:starts-with()
tree.xpath(‘//div[starts-with(@class, “nav”)]’) # 获取所有的以class属性为”nav”开头的div,如”nav1”、”naviss”
- 定位属性值包含部分相同属性名的标签:contains()
tree.xpath(‘//div[contains(@class, “top”)’) # 获取所有的class属性包含”top”的div,如”sstop”、”topss”、”stops”
- 选取前几个或者后几个标签:position()
tree.xpath(‘//ul[@id=’top’]/li[position()<4]) # 定位选取前3个li标签
- 索引定位:标签名[索引] 注意这里的索引从1开始
tree.xpath(‘//ul/li[3]’) # 第三个li
02.获取数据
- 获取文本:text()
tree.xpath(‘//ul/li/text()’) # 获取li标签下的所有文本内容,是一个列表
- 获取属性:@属性名
tree.xpath(‘//ul/li/a/@href’) # 获取a标签下的所有href属性,是一个列表
<a name="923e3c62"></a>
# 3. parsel模块
pass
<a name="9eee1105"></a>
# 4. Beautiful Soup4
<a name="e655a410"></a>
## 安装
```shell
pip install beautifulsoup4
bs4数据解析的步骤:
1.导入模块
from bs4 import BeautifulSoup
2.实例化BeautifulSoup对象
soup = BeautifulSoup(response.text, ‘lxml’)
3.bs4语法
01.定位
- soup.TagName:返回第一个标签对象
soup.a
- soup.find(‘TagName’):返回第一个标签对象
soup.find(‘div’)
- soup.find(‘TagName’, 属性名=’值’):返回第一个此属性的对象
soup.find(‘div’, class/id…=’nav’) # 因为这里的属性和xpath不一样不使用@所以class要加符号,不然和类中的class冲突了
- soup.find_all():返回所有符合要求的对象(列表)
soup.findall(‘div’) soup.find_all(‘div’, class/id…=’nav’)
- soup.select(‘选择器/层级选择器’):返回所有符合要求的对象(列表)
soup.select(‘.nav’) soup.select(‘ul li’)
02.获取数据
- 获取标签之间的文本数据
- soup.TagName.text/get_text():可以获取一个标签中所有的文本内容
soup.a.text soup.a.get_text()
- soup.TagName.string:只可以获取该标签下面直系的文本内容
soup.a.string
- 获取标签中属性值
soup.TagName[‘属性名’]
find()与find_all区别
- find_all()返回的是BeautifulSoup Tag对象组成的列表,如果没有找到符合要求的标签则返回空列表
- find()返回的是一个BeautifulSoup Tag对象,如果有多个符合条件的标签,则返回第1个,找不到则返回None