解析技术基础准备
HTML结构认知
HTML文档就像网页的骨架,由各种标签构成层级结构。例如:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>示例页面</title>
5 </head>
6 <body>
7 <div class="content">
8 <h1 id="main-title">欢迎学习Python解析</h1>
9 <ul class="list">
10 <li>第一项</li>
11 <li>第二项</li>
12 </ul>
13 </div>
14 </body>
15 </html>
开发者工具实战
在浏览器中按F12打开开发者工具:
- Elements:查看网页DOM结构
- Network:监控网络请求(重要!)
- 使用技巧:右键元素 -> 检查,快速定位代码位置

BeautifulSoup解析实战
环境安装
1 pip install beautifulsoup4
基础解析方法
1 from bs4 import BeautifulSoup
2 import requests
3
4 html = """
5 <html>
6 <body>
7 <div class="product">
8 <h2>Python编程书</h2>
9 <p class="price">¥59.00</p>
10 </div>
11 </body>
12 </html>
13 """
14
15 soup = BeautifulSoup(html, 'html.parser')
16
17 # 获取标题文本
18 title = soup.find('h2').text
19 print(f"书名:{title}")
20
21 # 获取价格
22 price = soup.find('p', class_='price').text
23 print(f"价格:{price}")
结果输出为:
1 书名:Python编程书
2 价格:¥59.00
CSS选择器进阶
1 # 选择所有<li>标签
2 items = soup.select('li')
3
4 # 选择class为product的div
5 products = soup.select('div.product')
6
7 # 层级选择器
8 price = soup.select('div.product > p.price')[0].text
美图实战案例-beatifulsoup
我们在某浏览器找到一个小姐姐的美图网站,为什么是小姐姐网站,因为sese是前进的动力,嘿哈…

可以看见该网站的结构还是挺简单的,图片主要放在一个div的p标签的img标签中,由此,我们根据BeautifulSoup写出图片的提取规则:
1 # 方式一:通过父容器精准定位
2 image_div = soup.find('div', id='image_div')
3 img_tags = image_div.find_all('img')
4 image_links = [img['src'] for img in img_tags]
5
6
7 # 方式二:直接查找所有图片(通用方法)
8 # img_tags = soup.find_all('img', {'decoding': 'async'})
9 # image_links = [img['src'] for img in img_tags]
10
接下来是标题,先看其网页结构:

很明显,标题在h1标签中,以此我们构建标题的规则为:
title_div = soup.find(‘div’, class_=’item_title’)
1 # 方法一:精准定位并移除span标签
2 h1_tag = title_div.find('h1')
3
4 # 移除不需要的span内容
5 if h1_tag.span:
6 h1_tag.span.decompose()
7
8 title = h1_tag.get_text(strip=True)
9 print("方法一提取结果:", title) # 输出:[艺图语] 2023.03.09 Vol.3035 庭芜绿 胖琦
10
11 # 方法二:直接提取并分割字符串(更简洁)
12 full_text = title_div.h1.get_text(strip=True)
13 clean_title = full_text.split('(')[0].strip()
14 print("方法二提取结果:", clean_title) # 输出同上
再用我们所设计好的下载函数,将图片下载到标题相应的文件夹中即可。以下是下载该页图片的完整代码,使用beatifulsoup。
1 from bs4 import BeautifulSoup
2 import functions.func_main as fun
3
4
5 url='https://www.74p.net/meitu/12079'
6 resp=fun.get_request_text(url)
7 soup = BeautifulSoup(resp, 'html.parser')
8
9 # 获取标题文本
10 title_div = soup.find('div', class_='item_title')
11 full_text = title_div.h1.get_text(strip=True)
12 clean_title = full_text.split('(')[0].strip()
13 print("标题:", clean_title) # 输出同上
14
15 #获取图片链接列表
16 img_tags = soup.find_all('img', {'decoding': 'async'})
17
18 print(img_tags,f'共找到图片{len(img_tags)}张图片!')
19 # 提取 src 属性
20 image_links = [img['src'] for img in img_tags]
21 #下载图片列表
22 fun.download_images(image_links, f'I:\\{clean_title}')
XPath与lxml高效解析
另一种常用解析方法是使用lxml库中的xpath法则,首先我们要了解xpath法则的一些基础含义:
表达式 | 说明 |
---|---|
/ | 从根节点选取 |
// | 匹配任意层级 |
@ | 选取属性,如img标签里的src |
* | 匹配任意元素 |
[n] | 第n个元素 |
以上表达式可以自行组合使用,如采用//*代表从根节点开始匹配任意元素。
同样是上面的代码,我们使用xpath解析图集标题和图片链接,首先是图片标题:
1 title=tree.xpath('//*[@class="item_title"]/h1/text()')[0]
其次是图片链接:
1 srcs=tree.xpath('//*[@class="image_div"]/p/img/@src')
可见lxml使用xpath提取元素会更简洁,以下是完整代码:
1 from lxml import etree
2 import functions.func_main as fun
3
4
5 url='https://www.74p.net/meitu/12079'
6 resp=fun.get_request_text(url)
7 #解析为可以被xpath提取的对象
8 tree=etree.HTML(resp)
9 #提取标题
10 title=tree.xpath('//*[@class="item_title"]/h1/text()')[0]
11 print(title)
12
13 #提取图片
14 srcs=tree.xpath('//*[@class="image_div"]/p/img/@src')
15 print(srcs,len(srcs))
16
17 fun.download_images(srcs, f'I://{title}')
最后可以略微查看我们的下载成果,满足sese的初始目的,嘿嘿…
