一、介绍
- 均是解析HTML文件的工具
- 服务器响应文件、本地文件都可以解析
二、xpath
1. 安装xpath模块
'''
1、安装
pip install lxm
2. 导入
from lxml import etree
'''
2. 浏览器插件——xpath调试工具的安装
'''
1. 介绍
这仅仅是一个调试工具,如不需要,完全可以跳过
在浏览器实时调试xpath语句的浏览器插件
2. 安装
链接:https://pan.baidu.com/s/15CO-Af7SG2AVw9PD_68rmg
提取码:bugu
3. Chrom浏览器 --> 右上角 --> 设置 --> 扩展程序 --> 直接将zip文件拖拽到页面中
4. 任意打开一个页面 --> Ctrl+Shift+X --> 打开插件成功
5. 在左边的输入框内输入xpath语句,即可在右边看到结果,可以实时的调试自己的xpath语句,很方便
'''
3. 解析服务器响应文件
import urllib.request
from lxml import etree
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
# 解析服务器响应文件:返回列表
tree = etree.HTML(content)
result = tree.xpath('//input[@id="su"]/@value')
print(result)
4. 解析本地文件
- 基本不用,省略
5. xpath语法
'''
1. 层级关系
-- 子孙:'//'
-- 亲儿子:'/'
2. 查找 属性id="11" 的 li 的 标签和内容 【有引号,且 双引号】
-- tree.xpath('//ul/li[@id="11"]')
3. 查找 属性id="11" 的 li 的 内容
-- tree.xpath('//ul/li[@id="11"]/text()')
4. 查找 属性id="11" 的 li 的 标签的某个属性的属性值
-- tree.xpath('//ul/li[@id="11"]/@sex')
5. 查找匹配到的第 2 个标签【从 1 开始】
-- tree.xpath('//div[@class="headswiper"]/div[2]')
# -------------------------------------------------------
# 下面是不常用的语法,个人建议完全不可以不用看!!!
# -------------------------------------------------------
6. 查找 属性id的值包含c的 li 标签【contains(@id, "c")】
-- tree.xpath('//body/ul/li[contains(@id, "c")]/text()')
7. 查找 属性xx的值以 xx 开头 的 li 标签的内容
-- tree.xpath('//body/ul/li[starts-with(@xx, "xx")]/text()')
8. 查询 属性a="a" 且 属性b="b" 的 li 标签的内容
-- tree.xpath('//body/ul/li[@a="a" and @b="b"]/text()')
'''
三、bs4
1. 安装bs4模块
'''
1、安装
pip install bs4
2. 导入
from bs4 import BeautifulSoup
'''
2. 解析服务器响应文件
from bs4 import BeautifulSoup
import urllib.request
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
# 解析服务器响应文件,返回 BeautifulSoup对象
soup = BeautifulSoup(content, 'lxml')
print(soup.find('a')) # 查找 <a> 标签,返回第一个符合规则的
3. 解析本地文件
- 基本不用,省略
4. bs4语法
from bs4 import BeautifulSoup
import urllib.request
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
soup = BeautifulSoup(content, 'lxml')
# 1. find()方法
# 作用:根据标签名、属性值查找
# 返回:第一个符合的结果
print(soup.find('a'))
print(soup.find('a', id="2")) # id="2"的a标签
print(soup.find('a', class_="99")) # class="99"的a标签,为了区别关键字,class写成class_
# 2. findall()方法
# 作用:根据标签名、属性值查找
# 返回:以列表的形式,返回所有符合的结果
print(soup.findAll(['a', 'span'])) # 返回所有的 a、span
print(soup.findAll('li', limit=2)) # 返回所有符合的结果的前两个数据
# 3. select()方法
# 作用:根据 css选择器 查找
# 返回:以列表的形式,返回所有符合的结果
print(soup.select('a')) # 标签选择器
print(soup.select('.xxyy')) # 类选择器
print(soup.select('#l1')) # id选择器
print(soup.select('a[id="l2"]')) # 属性选择器
print(soup.select('body ul li')) # 层级选择器
print(soup.select('body ul>li')) # 层级选择器
print(soup.select('a, li')) # 组合选择器
# 4. 获取标签对象的属性值、内容、标签名
# -- 上面三种方法返回的是 标签对象 或者 标签对象构成的列表
# -- 如果想获取标签的内容、属性、标签名称、、、
# -- 则需使用下面的方法
obj = soup.select('span')[0]
# 获取标签的内容
# -- xx.string
# -- xx.get_text()
# -- 两种方法都可以获取到
# -- 但是如果标签内除了内容还有其他标签的话,xx.string获取不到
print(obj.string)
print(obj.get_text()) # 故,更推荐
# 获取标签的属性
print(obj.name) # 获取标签名称
print(obj.attrs) # 将属性值,作为一个字典返回
print(obj.attrs['age']) # 获取标签属性——方法1
print(obj.get('age')) # 获取标签属性——方法2【推荐】
print(obj['age']) # 获取标签属性——方法3