re.findall匹配结果异常:为何一个仅返回最后一项?如何让两者均返回所有匹配
解决Yelp HTML抓取中正则仅返回最后一个匹配项的问题
嘿,我来帮你搞定这个正则匹配的问题!你的第一个正则只返回最后一个结果,核心原因是贪婪匹配在搞鬼,咱们一步步来解决:
问题根源
你第一个正则里的[\w\W]*是贪婪模式的量词——它会尽可能多地匹配字符,从第一个data-hovercard-id="开始,直接吃到最后一个><span>...</span></a的位置,自然就只捕获到最后一组符合条件的内容。而第二个正则的[\W]*因为匹配的是非单词字符,刚好你的HTML里价格范围的结构不会让它过度匹配,所以能返回所有结果。
快速修复:切换到非贪婪模式
只需要给贪婪量词*加上?,把它改成非贪婪模式,让正则匹配到第一个满足结束条件的位置就停下来。修改后的第一个正则应该是:
re.findall('data-hovercard-id="[\w\W]*?"><span>([\w\W]*?)</span></a', data)
这里的[\w\W]*?会匹配到下一个><span>就停止,而不是一直吃到最后,这样就能捕获所有符合条件的span内容了。
更靠谱的长期方案:别用正则解析HTML
说实话,用正则处理HTML是个“治标不治本”的办法——HTML的结构太灵活了,比如多一个空格、标签属性顺序变了、嵌套结构调整,你的正则就可能直接失效。更稳妥的做法是用专门的HTML解析库,比如BeautifulSoup:
举个简单的例子,提取价格范围和hovercard对应的内容:
from bs4 import BeautifulSoup soup = BeautifulSoup(data, 'html.parser') # 提取所有价格范围 price_ranges = [elem.get_text() for elem in soup.find_all('div', class_='business-attribute price-range')] # 提取所有带data-hovercard-id的a标签下的span内容 hovercard_spans = [span.get_text() for span in soup.select('a[data-hovercard-id] span')]
这样不管HTML结构有小的变动,解析库都能正确识别元素,比正则稳定太多。
内容的提问来源于stack exchange,提问作者Jamalan
相关产品推荐
相关产品推荐

