笔记 · 2025-02-28

Python网页解析完全指南:零基础到实战解析

解析技术基础准备

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的初始目的,嘿嘿…

目录