import re 遇到的提取问题

了解更多关注微信公众号“木下学Python”吧~

 

文档:https://docs.python.org/3.6/howto/regex.html

目录

1.常见的正则字符和转义

2.爬取结构

3.re.findall('正则表达式',匹配内容,re.S(换行匹配))

4.获取标签中的url

5.compile() 和 findall() 详解

6.匹配问题:

7.正则匹配的字符串去掉中间某些部分

8.标签问题

9.re.match(pattern,string,flags=0):

10.re.search

11.有 JavaScript 的信息字样的提取

12.re.purge()

13.匹配中文

14.贪婪与非贪婪


 

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>&nbsp;(.*?)<br /> 对

<span class="pl">出版者:</span>&nbsp;(.*?) 错
 <span class="pl">表演者: <a href="/search?q=Jason%20Mraz&amp;sid=2995812">Jason Mraz</a>
</span>

这种标签匹配Jason Mraz,

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

 

7.正则匹配的字符串去掉中间某些部分

 可用方法replace('去掉部分',''),用格代替

 

8.标签问题

1)网页上看到的标签是<br>,复制下来也是<br>,但就是错,说明标签是<br />或<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']

 

15.静态网页正则提取

直接右键检查,复制相应的片段去匹配,老是匹配不出,可以直接去源码网站,找到对应的行,把这一行复制去匹配

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值