当前位置:   article > 正文

用正则表达式爬取数据,网络爬虫正则表达式_用正则表达式提取网页内容

用正则表达式提取网页内容

本篇文章给大家谈谈用正则表达式爬取数据,以及网络爬虫正则表达式,希望对各位有所帮助,不要忘了收藏本站喔。

来源于此为了方便自己查找,进行了简化与整理。

本文涉及内容如下:

  1. 获取< tr>< /tr>标签之间内容
  2. 获取< a href…>< /a>超链接之间内容
  3. 获取URL最后一个参数命名图片或传递参数
  4. 爬取网页中所有URL链接
  5. 爬取网页标题title两种方法
  6. 定位table位置并爬取属性-属性值
  7. 过滤< span>< /span>等标签
  8. 获取< >< />等标签内容
  9. 通过replace函数过滤< br />标签
  10. 过滤html标签

1.获取 < tr> 标签之间内容

核心代码:

   s =  re.findall( r'<tr>(.*?)</tr>',language,re.S|re.M)

举个例子:

  1. import re
  2. doc = '''<tr><th>性別:</th><td>男</td></tr><tr>'''
  3. string1 = re.findall(r'<tr>(.*?)</tr>', doc, re.S | re.M)
  4. print(string1[0])
  5. string2= re.findall(r'<td>(.*?)</td>', doc, re.S | re.M)
  6. print(string2)#从这里可以看出返回的是一个列表
  1. 输出结果:
  2. >>>
  3. <th>性別:</th><td>男</td>
  4. ['男']
  5. >>>
  6. # re.I: 忽略大小写
  7. # re.M: 多行模式,改变'^'和'$'的行为
  8. # re.S: 点任意匹配模式,改变'.'的行为

2.获取超链接< a href=..>< /a >之间内容

核心代码:

    url =  re.findall(r'<a .*?>(.*?)</a>', content, re.S|re.M)

举个例子:

  1. import re
  2. doc = '''
  3. <td>
  4. <a href="https://www.baidu.com/articles/zj.html" title="浙江省">浙江省主题介绍</a>
  5. <a href="https://www.baidu.com//articles/gz.html" title="贵州省">贵州省主题介绍</a>
  6. </td>
  7. '''
  8. # 获取<a href></a>之间的内容
  9. print('获取链接文本内容:')
  10. s1 = re.findall(r'<a .*?>(.*?)</a>', doc, re.I|re.S|re.M)
  11. for i in s1:
  12. print(i)
  13. # 获取所有<a href></a>链接所有内容
  14. print('\n获取完整链接内容:')
  15. s2 = re.findall(r"<a href=.*?</a>", doc, re.I|re.S|re.M)
  16. for i in s2:
  17. print(i)
  18. # 获取<a href></a>中的URL
  19. print('\n获取链接中URL:')
  20. s = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')"
  21. s3 = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", doc, re.I|re.S|re.M)
  22. for i in s3:
  23. print(i)
  1. 输出结果:
  2. >>>
  3. 获取链接文本内容:
  4. 浙江省主题介绍
  5. 贵州省主题介绍
  6. 获取完整链接内容:
  7. <a href="https://www.baidu.com/articles/zj.html" title="浙江省">浙江省主题介绍</a>
  8. <a href="https://www.baidu.com//articles/gz.html" title="贵州省">贵州省主题介绍</a>
  9. 获取链接中URL:
  10. https://www.baidu.com/articles/zj.html
  11. https://www.baidu.com//articles/gz.html
  12. >>>

3.获取URL最后一个参数命名图片或传递参数

举个例子:

  1. url = "http://baidu.com.cn/file/2021/Img1415_00.jpg"
  2. value = url.split('/')[-1]
  3. print(value)
  1. 输出结果:
  2. >>>
  3. Img1415_00.jpg
  4. >>>

4.爬取网页中所有URL链接

举个例子:

  1. import re
  2. import urllib.request
  3. url = "http://www.csdn.net/"
  4. doc = urllib.request.urlopen(url).read().decode('utf-8')
  5. urls = re.findall(r"<a.*?href=.*?</a>", doc, re.I)
  6. for url in urls:
  7. print(url)
  8. link_list = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", doc)
  9. for url in link_list:
  10. print(url)
  1. 输出结果:
  2. >>>
  3. <a href="https://live.csdn.net" target="_blank" data-report-click="{&quot;spm&quot;:&quot;1000.2115.3001.4124&quot;,&quot;dest&quot;:&quot;https://live.csdn.net&quot;,&quot;extra&quot;:&quot;{\&quot;fId\&quot;:558,\&quot;fName\&quot;:\&quot;floor-www-index\&quot;,\&quot;compName\&quot;:\&quot;www-interaction\&quot;,\&quot;compDataId\&quot;:\&quot;index-nav-www\&quot;,\&quot;fTitle\&quot;:\&quot;\&quot;,\&quot;pageId\&quot;:141}&quot;}" data-report-query="spm=1000.2115.3001.4124"><img src="https://img-home.csdnimg.cn/images/20210708022656.png" alt="直播"> <span>直播</span></a>
  4. <a href="https://blink.csdn.net/" target="_blank" data-report-click="{&quot;spm&quot;:&quot;1000.2115.3001.4124&quot;,&quot;dest&quot;:&quot;https://blink.csdn.net/&quot;,&quot;extra&quot;:&quot;{\&quot;fId\&quot;:558,\&quot;fName\&quot;:\&quot;floor-www-index\&quot;,\&quot;compName\&quot;:\&quot;www-interaction\&quot;,\&quot;compDataId\&quot;:\&quot;index-nav-www\&quot;,\&quot;fTitle\&quot;:\&quot;\&quot;,\&quot;pageId\&quot;:141}&quot;}" data-report-query="spm=1000.2115.3001.4124"><img src="https://img-home.csdnimg.cn/images/20200629060547.png" alt="动态"> <span>动态</span></a>
  5. …………
  6. https://g.csdnimg.cn/static/logo/favicon32.ico
  7. https://www.csdn.net
  8. …………
  9. >>>

5.爬取网页标题title两种方法

举个例子:

  1. import re
  2. import urllib.request
  3. url = "http://www.csdn.net/"
  4. doc = urllib.request.urlopen(url).read().decode('utf-8')
  5. print('方法一:')
  6. ti = re.compile(r'(?<=<title>).*?(?=</title>)', re.M|re.S)
  7. tit = re.search(ti, doc)
  8. print(tit.group())
  9. #group() :匹配正则表达式整体结果,同group(0)python创意作品。
  10. #group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分。
  11. print('方法二:')
  12. title = re.findall(r'<title>(.*?)</title>', doc)
  13. print(title[0])
  1. 输出结果:
  2. >>>
  3. 方法一:
  4. CSDN - 专业开发者社区
  5. 方法二:
  6. CSDN - 专业开发者社区
  7. >>>

6.定位table位置并爬取属性-属性值

正则表达式可以通过find函数寻找指定table方法进行定位。

举个例子:

  1. start = content.find(r'<table class="infobox vevent"') #起点记录查询位置
  2. end = content.find(r'</table>')#结束位置
  3. print(doc[start:end])

标签内容中的属性值 td 可能存在其他属性,同时< td>< /td>之间的内容也需要处理。下面先讲解获取td值的例子:

  1. import re
  2. doc = '''<table>
  3. <tr>
  4. <td>序列号</td><td>DEIN3-39CD3-2093J3</td>
  5. <td>日期</td><td>2013年1月22日</td>
  6. <td>售价</td><td>392.70 元</td>
  7. <td>说明</td><td>仅限5用户使用</td>
  8. </tr>
  9. </table>
  10. '''
  11. s = r'<td>(.*?)</td><td>(.*?)</td>'
  12. m = re.findall(s, doc, re.S | re.M)
  13. for line in m:
  14. print(line[0],line[1])
  1. 输出结果:
  2. >>>
  3. 序列号 DEIN3-39CD3-2093J3
  4. 日期 2013122
  5. 售价 392.70
  6. 说明 仅限5用户使用
  7. >>>

如果为< td id=“”>,则正则表达式为r’< td id=.?>(.?)< /td>’
如果不是id属性开头,则正则表达式为r’<td .?>(.?)< /td>’


7.过滤< span>< /span>等标签

举个例子:

  1. import re
  2. doc = '''
  3. <table class="infobox bordered vcard" style="width: 21em; font-size: 89%; text-align: left;" cellpadding="3">
  4. <tr>
  5. <th>異名:</th>
  6. <td><span class="nickname">(字) 翔宇</span></td>
  7. </tr>
  8. <tr>
  9. <th>籍貫:</th>
  10. <td><a href="../articles/%E81.html" title="浙江省">浙江省</a><a href="../articles/%E7%BB%8D82.html" title="绍兴市">绍兴市</a></td>
  11. </tr>
  12. </table>
  13. '''
  14. # 获取table中tr值
  15. str = re.findall(r'<tr>(.*?)</tr>', doc, re.S | re.M)
  16. for line in str:
  17. # 获取表格第二列td 属性
  18. td = re.findall(r'<td>(.*?)</td>', line, re.S|re.M)
  19. for n in td:
  20. if "span" in n: # 处理标签<span>
  21. value = re.findall(r'<span .*?>(.*?)</span>', n, re.S|re.M)
  22. for i in value:
  23. print(i)
  1. 输出结果:
  2. >>>
  3. (字) 翔宇
  4. >>>

8.获取< > < />等标签内容

在获取图集对应的原图它是存储在中,其中获取原图-original即可,缩略图-thumb,大图-big,通过正则表达式下载URL:

  1. import re
  2. import urllib.request
  3. import os
  4. content = '''
  5. <>var images = [
  6. { "big":"http://i-2.yxdown.com/2015/3/18/KDkwMHgp/6381cce.jpg",
  7. "thumb":"http://i-2.yxdown.com/2015/3/18/KHgxMjAp/6381ccce.jpg",
  8. "original":"http://i-2.yxdown.com/2015/3/18/6381ccc03e.jpg", }
  9. </>
  10. '''##我进行了简化,这里只是展示爬取方法,所以这个网址不存在404
  11. str = re.findall(r'<>(.*?)</>', content, re.S | re.M)
  12. for in str:
  13. m = re.findall(r'"original":"(.*?)"', )
  14. for i in m:
  15. print(i)
  16. filename = os.path.basename(i) # 去掉目录路径,返回文件名
  17. urllib.request.urlretrieve(i,'E:\\'+filename) #下载图片

输出结果:会输出网址,同时下载图片至E盘。


9.通过replace过滤< br />标签

核心代码:

  1. if '<br />' in value:
  2. value = value.replace('<br />','') #过滤该标签
  3. value = value.replace('\n',' ') #换行空格替代 否则总换行

10.过滤html标签

核心代码:

    value = re.sub('<[^>]+>','', doc)

举个例子:

  1. import re
  2. doc = '''
  3. <table class="infobox" style="width: 21em; text-align: left;" cellpadding="3">
  4. <tr bgcolor="#CDDBE8">
  5. <th colspan="2">
  6. <center class="role"><b>中華民國政治人士</b><br /></center>
  7. </th>
  8. </tr>
  9. <tr>
  10. <th>政黨:</th>
  11. <td><span class="org">
  12. <img alt="中國國民黨" src="../../../../images/Kuomintang.svg.png" width="19" height="19" border="0" />
  13. <a href="../../../../articles/%8B%E6%B0%91%E9%BB%A8.html" title="中國國民黨">中國國民黨</a></span></td>
  14. </tr>
  15. </table>
  16. '''
  17. value = re.sub('<[^>]+>', '', doc) # 过滤HTML标签
  18. print(value)
  1. 输出结果:
  2. >>>
  3. 中華民國政治人士
  4. 政黨:
  5. 中國國民黨
  6. >>>

推荐文章:Python正则表达式指南

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树网络爬虫urllib428830 人正在系统学习中
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号