Python正则表达式教程:爬虫数据提取语法+实战技巧,附常见错误解决方法

admin python教程 4


做 Python 爬虫的新手是不是常遇到这种情况?爬下来的网页源码一大段,想提取里面的标题、链接却无从下手;抄了别人的正则表达式,换个网页就提取不到数据;好不容易匹配到内容,结果把无关字符也一起抓进来了。别着急,兔子哥当初用正则爬取新闻网站时,光是提取文章标题就改了五遍正则,要么漏提取要么多抓内容。今天就专门讲 Python 爬虫里的正则表达式用法,从基础语法到实战技巧,再到常见错误解决,新手跟着学,轻松用正则提取爬虫数据!

一、爬虫为啥非正则不可?这 3 个场景必须用


可能有朋友会问:“Python 爬虫有 BeautifulSoup、XPath 这些工具,为啥还要学正则?” 其实正则在这几个场景里特别好用,效率还高:
  • 提取无固定标签的内容,比如网页中夹杂在 JavaScript 里的链接、藏在杂乱文本中的手机号
  • 快速清洗爬取的脏数据,比如去掉多余空格、换行、特殊符号
  • 处理简单的匹配需求,比写复杂的 XPath 表达式更省事

就像爬一个没有规范 HTML 结构的网页,标签混乱得很,这时候正则表达式就派上用场了,只要找到内容的规律,几行代码就能提取想要的数据。

二、爬虫必备正则语法:5 个核心符号,会这些就够用


正则符号不用全记,这几个在爬虫里高频使用,吃透它们,大部分数据提取需求都能搞定。
  1. 匹配数字和字母:\d \w . 基础中的基础

  • \d:匹配任意数字(0-9),爬取价格、页码、ID 时必用。比如提取商品价格 “¥199.9” 里的数字,用\d+\.\d+就能匹配 “199.9”。
  • \w:匹配字母、数字、下划线,提取用户名、标题中的关键字符很方便。比如\w+能匹配 “news2023”“article_title” 这类内容。
  • .:匹配任意单个字符(除了换行),万能通配符。想匹配 “” 里的链接,用就行,.会匹配引号里的任意内容。

  1. 控制匹配次数: + ? {n} 精准提取不超范围*

  • *:匹配前面的字符 0 次或多次,比如"title": ".*?"能匹配 JSON 数据里的标题值,不管标题长短都能抓全。
  • +:匹配前面的字符 1 次或多次,比*更严格,确保内容至少出现一次。提取邮箱时用\w+@\w+\.\w++保证用户名和域名不为空。
  • ?:让匹配变得 “非贪婪”,这在爬虫里超重要!默认正则是贪婪匹配,会尽可能多抓内容,加个?就会尽可能少抓。比如

    .*?

    只会匹配第一个前的内容,不会把后面的标签也抓进来。
  • {n,m}:匹配固定次数或范围,提取固定长度的内容用它。比如提取 11 位手机号\d{11},提取 6-18 位密码\w{6,18}

符号作用爬虫常用场景例子
\d匹配数字价格、ID、页码\d+.\d+ 匹配带小数的价格
.任意字符万能匹配.*? 非贪婪匹配任意内容
+1 次以上非空内容提取\w+@\w+.\w+ 匹配邮箱
?非贪婪匹配限制标签内内容.*? 提取标题
{n}固定次数固定长度内容\d {11} 提取手机号

三、实战技巧:用 Python re 模块爬数据,3 步搞定


Python 的 re 模块是正则爬虫的好帮手,掌握这几个函数,数据提取效率翻倍。
  1. re.findall:批量提取所有匹配内容
    这是爬虫里用得最多的函数,能返回所有匹配的结果列表。比如爬取网页中的所有链接:
    import re html = '新闻博客' links = re.findall(r'href="(.*?)"', html) print(links) # 输出:['https://news.com', 'https://blog.com']
    这里用括号()把想要提取的部分括起来,findall 就会只返回括号里的内容,超实用。
  2. re.search:提取第一个匹配内容
    如果只需要第一个匹配结果,用 search 更高效。比如提取网页标题:
    title = re.search(r'(.*?)', html).group(1)
    注意用group(1)获取括号里的内容,要是没匹配到会报错,最好加个判断:
    result = re.search(r'(.*?)', html) if result: title = result.group(1)
  3. re.sub:清洗爬取的脏数据
    爬下来的数据常带多余空格、换行,用 sub 替换掉:
    dirty_text = ' 这是一段 有很多 空格的文本 \n' clean_text = re.sub(r'\s+', ' ', dirty_text).strip() print(clean_text) # 输出:这是一段 有很多 空格的文本
    \s+匹配多个空格、换行,替换成单个空格,再用 strip () 去掉首尾空格,数据瞬间干净。

四、常见错误解决:爬虫正则最容易踩的 5 个坑


  1. 提取不到数据,正则写对了却返回空列表
    大概率是没考虑换行符!网页源码里有很多\n,而.默认不匹配换行,导致跨多行的内容匹配不到。解决方法:在正则后加re.DOTALL参数,让.匹配换行,比如re.findall(r'内容(.*?)结束', html, re.DOTALL)。兔子哥第一次爬跨多行的文本时,就因为没加这个参数,折腾了半小时才找到原因。
  2. 匹配内容太多,把无关字符也抓进来了
    这是贪婪匹配在搞鬼!比如用.*提取内容,会匹配到最后一个,中间可能夹杂其他 div。解决方法:加?用非贪婪匹配,.*?改成.*?,只匹配到第一个结束标签。

  • 特殊符号没转义,正则失效
    正则里的. * + ( ) [ ]这些是特殊符号,想匹配它们本身必须加\转义。比如爬取包含$的价格 “$99”,正则得写\$(\d+),直接写$(d+)会报错,因为$\ 在正则里表示结尾。
  • 忘记用 r 前缀,转义符失效
    Python 字符串里\是转义符,正则里\d需要写成\\d,但加个 r 前缀就不用转义了,r'\d+''\\d+'更方便。很多新手忘加 r 前缀,导致\d变成d,匹配不到数字。
  • 过度依赖正则,复杂场景效率低
    正则适合简单匹配,遇到复杂 HTML 结构,比如嵌套多层标签的内容,用 BeautifulSoup 更合适。别硬扛,正则和其他工具结合着用,爬虫效率才高。比如先用 BeautifulSoup 定位到大致区域,再用正则提取细节内容。

  • 五、自问自答:爬虫正则新手常问的 3 个问题


    1. “正则和 XPath 哪个更适合爬虫?”
      简单场景用正则快,比如提取无标签的文本、清洗数据;复杂 HTML 结构用 XPath 更稳定,不容易出错。新手建议两者都学,根据场景选工具,别吊死在一棵树上。
    2. “怎么快速测试正则是否正确?”
      推荐用在线工具 “regex101”,左边输正则,右边输网页源码片段,实时看匹配结果,哪里错了一目了然。爬之前先在工具里测好正则,再放到代码里,能少踩很多坑。
    3. “爬不同网站都要重写正则吗?”
      是的,每个网站的内容格式不同,正则要根据实际源码调整。但核心思路不变:先找内容的规律(比如前后固定的标签、特殊符号),再用正则定位规律之间的内容,多练几个网站就熟了。

    结尾心得


    Python 爬虫里的正则表达式,难的不是符号本身,是怎么根据网页源码找到匹配规律。兔子哥的经验是,爬一个网站前,先把源码保存到本地,用记事本打开找内容前后的 “标志性字符”,比如标题前有

    ,后有,这就是写正则的关键。刚开始慢点没关系,写多了就会发现,再乱的源码都能找到规律。记住,正则不用追求一次写对,多测试、多调整,你很快就能用正则轻松提取爬虫数据!

    标签: 正则表达式 BeautifulSoup

    发布评论 0条评论)

    • Refresh code

    还木有评论哦,快来抢沙发吧~