re.findall能否输出纯匹配字符串列表?如何修改正则实现?
问题:使用re.findall()提取纯商品名称列表
re.findall()可以输出仅包含目标匹配字符串的列表,只需调整正则表达式的写法即可。以下是具体问题和解决方案:
现有HTML片段示例
[<p class="a-text-left a-size-base">Klasisch 1 Säulen Grün S</p>, <p class="a-text-left a-size-base">Klasisch 3 Säulen Braun L</p>, <p class="a-text-left a-size-base">Klasisch 3 Säulen Braun M</p>, <p class="a-text-left a-size-base">Klasisch 3 Säulen Grün M</p>, <p class="a-text-left a-size-base">Mit Hängematte Grün L</p>, <p class="a-text-left a-size-base">Weinachten 3 Säulen Grün L</p>]
当前使用的正则表达式
var_text = re.findall(r'>.+?<', str(varyasyonlar_text))
错误输出示例
['>Klasisch 1 Säulen Grün S<', '>, <', '>Klasisch 3 Säulen Braun L<', '>, <', '>Klasisch 3 Säulen Braun M<', '>, <', '>Klasisch 3 Säulen Grün M<', '>, <', '>Mit Hängematte Grün L<', '>, <', '>Weinachten 3 Säulen Grün L<']
需求:得到仅包含纯商品名称的干净列表。
解决方案
方案1:修改正则表达式(精准捕获目标内容)
通过添加捕获组并精准匹配目标标签,让re.findall()只返回商品名称:
var_text = re.findall(r'<p class="a-text-left a-size-base">([^<]+)</p>', str(varyasyonlar_text))
正则说明:
<p class="a-text-left a-size-base">:精准定位目标p标签的开头([^<]+):捕获组,匹配所有非<的字符(即商品名称,遇到</p>的<时停止)</p>:匹配标签结尾
执行后会直接得到干净的商品名称列表:
['Klasisch 1 Säulen Grün S', 'Klasisch 3 Säulen Braun L', 'Klasisch 3 Säulen Braun M', 'Klasisch 3 Säulen Grün M', 'Mit Hängematte Grün L', 'Weinachten 3 Säulen Grün L']
方案2:使用HTML解析库(更健壮的方案)
正则处理HTML容易受标签格式变化影响,推荐用专业的HTML解析库如BeautifulSoup:
from bs4 import BeautifulSoup # 解析HTML并提取目标标签文本 soup = BeautifulSoup(str(varyasyonlar_text), 'html.parser') var_text = [p.get_text(strip=True) for p in soup.find_all('p', class_='a-text-left a-size-base')]
这种方法无需担心标签属性调整、格式换行等问题,兼容性更强。
内容的提问来源于stack exchange,提问作者Enes Kasikci
相关产品推荐
相关产品推荐

