re.match和re.search默认不匹配标签内容是因为.等贪婪量词会匹配到最末尾闭合标签;应改用.?等非贪婪模式,并配合1*防属性干扰,但html结构复杂时仍需改用beautifulsoup。> ↩

为什么 re.match 和 re.search 默认不匹配到标签内容?
因为正则默认是贪婪模式,.* 会尽可能吞掉所有字符,直到最后一个闭合标签为止。比如用 re.search(r'<div>(.*)</div>', html) 处理 '<div>A</div>
<div>B</div>',捕获组得到的是 'A<div>B',根本不是你想要的“第一个 div 的内容”。
<h3>怎么写非贪婪匹配才真正提取单个标签内容?</h3>
<p>在量词后面加 <code>?:把 .* 换成 .*?,把 + 换成 +?。关键是要让正则“见到第一个闭合就停”。
- 提取最内层
<p></p>内容:re.search(r'<p>(.*?)</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8054" title="python-parallelization"><img src="https://img.php.cn/upload/skill/000/000/081/179181013081932.jpg" alt="python-parallelization" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill8054" title="python-parallelization" class="overflowclass">python-parallelization</a> <p class="overflowclass">将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。</p> </div> <a rel="nofollow" href="/xiazai/skill8054" title="python-parallelization" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>', html) - 提取带属性的
<span class="name"></span>:re.search(r'<span>]*>(.*?)</span>', html)([^>]*防止误吞属性里的>) - 注意:如果标签跨行,得加
re.DOTALL标志,否则.不匹配换行符
哪些常见场景下 re 提取 HTML 会翻车?
非贪婪只是让匹配“短一点”,但不能解决 HTML 结构复杂性问题。
- 嵌套标签:
'<div><div>content</div></div>'中r'<div>(.*?)</div>'只能拿到'<div>content' —— 因为它匹配的是第一个 <code>










