悠悠楠杉
网站页面
正文:
在网页抓取或内容分析时,经常需要从HTML中分离出特定标签(如<p>段落和<table>表格)。但HTML结构复杂,直接字符串匹配容易出错。本文将分享两种可靠方法:正则表达式和DOM解析,并对比其优缺点。
正则适合简单场景,但需注意HTML嵌套问题。以下代码提取所有P标签内容:
html
import re
html = """
这是第一段
表格内容
这是第二段
"""
# 提取P标签(非贪婪模式)
p_tags = re.findall(r'(.*?)', html, re.DOTALL)
print("提取的P标签:", p_tags)
# 提取Table标签
tables = re.findall(r'(.*?)', html, re.DOTALL)
print("提取的Table标签:", tables)
注意点:
1. .*?表示非贪婪匹配,避免跨标签捕获;
2. re.DOTALL让.匹配换行符;
3. 正则无法完美处理嵌套标签(如<table>内嵌另一个<table>)。
使用BeautifulSoup或DOMParser可精准操作HTML树结构。以下是Python示例:
html
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
# 提取所有P标签文本
p_contents = [p.get_text(strip=True) for p in soup.find_all('p')]
print("DOM提取的P标签:", p_contents)
# 提取Table标签HTML
table_html = [str(table) for table in soup.find_all('table')]
print("DOM提取的Table标签:", table_html)
优势:
- 自动处理嵌套和属性(如class="note");
- 支持XPath或CSS选择器进一步过滤。
实际项目中,建议:
1. 预处理HTML:用html.strip()清除多余空格;
2. 错误处理:捕获AttributeError等异常;
3. 性能优化:对大型HTML使用lxml解析器。
常见问题:
- 表格内含<p>标签时,需递归检查子节点;
- 动态渲染的页面需先用Selenium获取完整HTML。