一、介绍

  • 均是解析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