Python HTML解析需求:提取(id, value)格式数组
从HTML中提取(id, value)格式的数组
你的正则思路方向是对的,但可以优化一下,避免匹配不到或者误匹配的情况。先理清楚核心逻辑:每个title属性对应id,对应的value则在带有id="content wrap"的元素中对吧?
优化后的正则表达式
假设你的HTML结构大概是这样:
<div title="id1"><span id="content wrap">value1</span></div> <div title="id2"><span id="content wrap">value2</span></div>
用下面的正则可以更稳定地捕获配对:
import re # 编译正则,加上re.DOTALL让.能匹配换行符 pattern = re.compile(r'title="([^"]+)".*?id="content wrap".*?>([^<]+)<', re.DOTALL) matches = pattern.findall(source_html)
正则拆解
title="([^"]+)": 捕获title里的id,用[^"]+替代.+?,避免在title属性里遇到转义引号或者意外字符时出错.*?: 非贪婪匹配title和content wrap元素之间的任意内容,防止跳过多个配对id="content wrap": 精准匹配目标元素的id.*?>: 匹配到content wrap元素的闭合标签([^<]+)<: 捕获元素内的文本值(假设value是纯文本,没有嵌套标签)
处理复杂情况
如果value里可能包含HTML标签或者换行,就需要调整捕获逻辑,再做清洗:
pattern = re.compile(r'title="([^"]+)".*?id="content wrap"(.*?)</', re.DOTALL) raw_matches = pattern.findall(source_html) # 清洗掉HTML标签,整理成干净的配对 cleaned_pairs = [(id, re.sub(r'<.*?>', '', value.strip())) for id, value in raw_matches]
更稳妥的替代方案:用HTML解析器
其实正则处理HTML容易踩坑(比如标签嵌套、属性顺序变化),用BeautifulSoup这类解析器会更靠谱:
from bs4 import BeautifulSoup soup = BeautifulSoup(source_html, 'html.parser') pairs = [] # 找到所有content wrap元素 for wrap_elem in soup.find_all(id="content wrap"): # 找带title属性的父元素 parent = wrap_elem.find_parent(title=True) if parent: pairs.append((parent['title'], wrap_elem.get_text(strip=True)))
这种方法不用纠结正则的细节,能适应更多HTML结构的变化。
内容的提问来源于stack exchange,提问作者K. H.
相关产品推荐
相关产品推荐

