美文网首页
import re 遇到的提取问题

import re 遇到的提取问题

作者: 木下瞳 | 来源:发表于2019-07-25 18:13 被阅读0次

    了解更多关注微信公众号“木下学Python”吧~
    原文:https://blog.csdn.net/zjkpy_5/article/details/81041726

    1.常见的正则字符和转义
    https://www.imooc.com/article/20354

            https://blog.csdn.net/u010760374/article/details/79974586
    

    2.爬取结构
    res = requests.get(url,headers = headers)

    爬取

    names = re.findall('<a.?>(.?)</a>',res.text,re.S) #re.S 换行匹配

    3.re.findall('正则表达式',匹配内容,re.S(换行匹配))
    匹配所有符合的!

           如:
    

    import re
    line = '123 is a 321'
    p = re.findall(r'[0-9]+',line)
    print(p)
    结果返回列表 ['123','321']

    def get_info(url):
    res = requests.get(url,headers = headers)

     #判断请求码是否为200
     if res.status_code == 200:
    
         contents = re.findall('<p>(.*?)</p>',res.content.decode('utf-8'),re.S)
         
         for content in contents:
    
             f.write(content + '\n')
                匹配内容如果为网页上的字,匹配内容写成:res.content.decode('utf-8') 或 res.text;.content 获得二进制代码
    

    4.获取标签中的url

    <img width="100" alt="泰坦尼克号" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p457760035.webp" class="">
    获取名字:namePat = r'alt="(.*?)" src='

            获取url:imgPat = r'src="(.*?)" class='
    

    5.compile() 和 findall() 详解
    https://blog.csdn.net/drdairen/article/details/51134816

    获取文章链接正则

    article_url = '<div class="txt-box">.?(http://.?)"'
    article_urls_list.append(re.compile(article_url,re.S).findall(data1))
    compile() 是编译函数,把字符串编译成正则,然后用 findall()匹配源码

    6.匹配问题:
    <span class="pl">出版者:</span> (.*?)<br /> 对

    <span class="pl">出版者:</span> (.*?) 错
    <span class="pl">表演者: <a href="/search?q=Jason%20Mraz&sid=2995812">Jason Mraz</a>
    </span>
    这种标签匹配Jason Mraz,

    '表演者:.?>(.?)</a>'

    7.正则匹配的字符串去掉中间某些部分
    可用方法replace('去掉部分',''),用格代替

    8.标签问题
    1)网页上看到的标签是
    ,复制下来也是
    ,但就是错,说明标签是<br />或

    2)标签中的内容太长可以省略:

    <span class="pl">上映日期:</span><span property="v:initialReleaseDate" content="2006-06-30(中国大陆)">2006-06-30(中国大陆)</span>
    <span class="pl">上映日期:.?">(.?)</span>

    9.re.match(pattern,string,flags=0):
    pattern为正则表达式,string为匹配的字符串,flags 用来控制正则表达式的匹配方式,如是否区分大小写,多行匹配等,

        只能从字符串其实位置开始匹配。只能匹配一个!
    
        例如:
    

    import re

    line = 'zjk is a handsome boy,he like zxy.!!!'

    m = re.match(r'(.) boy,he (.).(.*)',line)

    print(m.group(0))
    print(m.group(1))
    print(m.group(2))
    print(m.group(3))
    print(m.groups())
    print(m.group(0)) 为打印匹配的原字符串 line

       print(m.group(1)) 打印第一个括号返回的结果,下面两个同理
    
       print(m.groups()) 打印匹配结果的列表,每一组都以元组形式表
    

    10.re.search
    import re

    line = 'zjk is a handsome boy,he like zxy.!!!'

    m = re.match(r'zxy',line)
    n = re.search(r'zxy',line)

    print(m)
    print(n)
    它与 re.match 不同的是扫描整个字符串

    11.有 JavaScript 的信息字样的提取
    其下的标签也要在源码中提取

    <a href="javascript:void(0);" id="js_name">狗熊会</a>
    要提取 ‘狗熊会’;使用如下正则会没有结果

    <a href="javascript:void(0);" id="js_name">(.*?)</a>
    要在网页源代码中提取,网页源代码,以及正则如下

    var nickname = "狗熊会" #源代码

    var nickname = "(.*?)" #正则

    12.re.purge()
    清除缓存

    13.匹配中文
    [\u4e00-\u9fa5]

    14.贪婪与非贪婪
    贪婪:尽可能匹配一个字符串里面多个符合的

    非贪婪:尽可能往后匹配符合的

    非贪婪

    import re
    a = '1234;456789;'
    b = re.findall(r'(.*);',a)
    print(b)

    ['1234;456789']

    贪婪

    import re
    a = '1234;456789;'
    b = re.findall(r'(.*?);',a)
    print(b)

    ['1234', '456789']

    相关文章

      网友评论

          本文标题:import re 遇到的提取问题

          本文链接:https://www.haomeiwen.com/subject/krlkrctx.html