常⽤正则表达式爬取⽹页信息及分析HTML标签总结
这篇⽂章主要是介绍Python爬取⽹页信息时,经常使⽤的正则表达式及⽅法。它是⼀篇总结性⽂章,实⽤性⽐较⼤,主要解决⾃⼰遇到的爬⾍问题,也希望对你有所帮助~
当然如果会Selenium基于⾃动化测试爬⾍、BeautifulSoup分析⽹页DOM节点,这就更⽅便了,但本⽂更多的是介绍基于正则的底层爬取分析。
涉及内容如下:
常⽤正则表达式爬取⽹页信息及HTML分析总结
1.获取<tr></tr>标签之间内容
2.获取<a href..></a>超链接之间内容
3.获取URL最后⼀个参数命名图⽚或传递参数
4.爬取⽹页中所有URL链接
5.爬取⽹页标题title两种⽅法
6.定位table位置并爬取属性-属性值
7.过滤<span></span>等标签
8.获取<script></script>等标签内容
9.通过replace函数过滤<br />标签
10.获取<img ../>中超链接及过滤<img>标签
推荐基础⽂章:Python正则表达式指南 - AstralWind
------------------------------------------------------------------------------------------------------------------------------
1.获取<tr></tr>标签之间内容
该部分主要是通过正则表达式获取两个标签之间的内容,通常这种标签都是成对出现的。
开始标签如:<tr>、<th>、<td>、<a>、<table>、<div>...
后缀标签如:</tr>、</th>、</td>、</a>、</table>、</div>...
核⼼代码:
res_tr = r'<tr>(.*?)</tr>'
m_tr =  re.findall(res_tr,language,re.S|re.M)
例⼦:
# coding=utf-8
import re
language = '''<tr><th>性別:</th><td>男</td></tr><tr>'''
#正则表达式获取<tr></tr>之间内容
res_tr = r'<tr>(.*?)</tr>'
m_tr = re.findall(res_tr,language,re.S|re.M)
for line in m_tr:
print line
#获取表格第⼀列th 属性
res_th = r'<th>(.*?)</th>'
m_th = re.findall(res_th,line,re.S|re.M)
for mm in m_th:
print unicode(mm,'utf-8'), #unicode防⽌乱
#获取表格第⼆列td 属性值
res_td = r'<td>(.*?)</td>'
m_td = re.findall(res_td,line,re.S|re.M)
for nn in m_td:
print unicode(nn,'utf-8')
输出如下所⽰:
>>>
<th>性別:</th><td>男</td>
性別:男
>>>
python通过re模块提供对正则表达式的⽀持。使⽤re的⼀般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使⽤Pattern实例处理⽂本并获得匹配结果(⼀个Match实例),最后使⽤Match实例获得信息,进⾏其他的操作。
findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]): 搜索string,以列表形式返回全部能匹配的⼦串。其中RE的常见参数包括:        re.I(re.IGNORECASE): 忽略⼤⼩写(括号内是完整写法)
re.M(re.MULTILINE): 多⾏模式,改变'^'和'$'的⾏为
re.S(re.DOTALL): 点任意匹配模式,改变'.'的⾏为
-
-----------------------------------------------------------------------------------------------------------------------------
2.获取超链接<a href=..></a>之间内容
通常在使⽤正则表达式时,需要分析⽹页链接,获取URL或⽹页内容。核⼼代码如下:
res = r'<a .*?>(.*?)</a>'
mm =  re.findall(res, content, re.S|re.M)
urls=re.findall(r"<a.*?href=.*?<\/a>", content, re.I|re.S|re.M)
例⼦:
------------------------------------------------------------------------------------------------------------------------------
3.获取URL最后⼀个参数命名图⽚或传递参数
------------------------------------------------------------------------------------------------------------------------------
4.爬取⽹页中所有URL链接
-
-----------------------------------------------------------------------------------------------------------------------------
5.爬取⽹页标题title两种⽅法
获取⽹页标题也是⼀种常见的爬⾍,如我在爬取国家信息时,就需要爬取⽹页title。通常位于<html><head><title>标题</title> </head></html>中。
下⾯是爬取CSDN标题的两种⽅法介绍:
# coding=utf-8
import re
import urllib
url = "www.csdn/"
content = urllib.urlopen(url).read()
print u'⽅法⼀:'
title_pat = r'(?<=<title>).*?(?=</title>)'
title_ex = repile(title_pat,re.M|re.S)
title_obj = re.search(title_ex, content)
title = up()
print title
print u'⽅法⼆:'
title = re.findall(r'<title>(.*?)</title>', content)
print title[0]
输出如下所⽰:
>>>
⽅法⼀:
CSDN.NET - 全球最⼤中⽂IT社区,为IT专业技术⼈员提供最全⾯的信息传播和服务平台
⽅法⼆:
CSDN.NET - 全球最⼤中⽂IT社区,为IT专业技术⼈员提供最全⾯的信息传播和服务平台
>>>
------------------------------------------------------------------------------------------------------------------------------
6.定位table位置并爬取属性-属性值
如果使⽤Python库的⼀些爬取,通常可以通过DOM树结构进⾏定位,如代码:
login = driver.find_element_by_xpath("//form[@id='loginForm']")
参考⽂章:[Python爬⾍] Selenium实现⾃动登录163邮箱和Locating Elements介绍
------------------------------------------------------------------------------------------------------------------------------
7.过滤<span></span>等标签
在获取值过程中,通常会存在<span>、<br>、<a href>等标签,下⾯举个例⼦过滤。
<td><span class="nickname">(字) 翔宇</span></td>过滤标签<span>核⼼代码:
elif "span" in nn: #处理标签<span>
res_value = r'<span .*?>(.*?)</span>'
m_value = re.findall(res_value,nn,re.S|re.M)
for value in m_value:
print unicode(value,'utf-8'),
代码如下,注意print中逗号连接字符串:
# coding=utf-8
import re
language = '''
<table class="infobox bordered vcard" cellpadding="3">
<caption class="fn"><b>***</b></caption>
<tr>
<th>性別:</th>
<td>男</td>d
</tr>
<tr>
<th>異名:</th>
<td><span class="nickname">(字) 翔宇</span></td>
</tr>
<tr>
<th>政黨:</th>
<td><span class="org"><a href="../articles/%E4%B8%AD9A.html" title="中国共产">中国共产</a></span></td>
</tr>
<tr>
<th>籍貫:</th>
<td><a href="../articles/%E6%B5%9981.html" title="浙江省">浙江省</a><a href="../articles/%E7%BB%8D82.html" title="绍兴市">绍兴市</a></td>
</tr>
</table>
'''
#获取table中tr值
res_tr = r'<tr>(.*?)</tr>'
m_tr = re.findall(res_tr,language,re.S|re.M)
for line in m_tr:
#获取表格第⼀列th 属性
res_th = r'<th>(.*?)</th>'
m_th = re.findall(res_th,line,re.S|re.M)
for mm in m_th:
if "href" in mm: #如果获取加粗的th中含超链接则处理
restr = r'<a href=.*?>(.*?)</a>'
h = re.findall(restr,mm,re.S|re.M)
print unicode(h[0],'utf-8'), #逗号连接属性值防⽌换⾏
else:
print unicode(mm,'utf-8'), #unicode防⽌乱
#获取表格第⼆列td 属性值
res_td = r'<td>(.*?)</td>' #r'<td .*?>(.*?)</td>'
m_td = re.findall(res_td,line,re.S|re.M)
for nn in m_td:
if "href" in nn: #处理超链接<a href=../rel=..></a>
res_value = r'<a .*?>(.*?)</a>'
m_value = re.findall(res_value,nn,re.S|re.M)
for value in m_value:
print unicode(value,'utf-8'),
elif "span" in nn: #处理标签<span>
res_value = r'<span .*?>(.*?)</span>'
m_value = re.findall(res_value,nn,re.S|re.M) #<td><span class="nickname">(字) 翔宇</span></td>
for value in m_value:
print unicode(value,'utf-8'),
else:
print unicode(nn,'utf-8'),
print ' ' #换⾏
输出如下所⽰:
>>>
性別:男
異名: (字) 翔宇
政黨:中国共产
籍貫:浙江省绍兴市
>>>
------------------------------------------------------------------------------------------------------------------------------
8.获取<script></script>等标签内容
⽐如在获取游讯⽹图库中,图集对应的原图它是存储在script中,其中获取原图-original即可,缩略图-thumb,⼤图-big,通过正则表达式下载URL:
res_original = r'"original":"(.*?)"' #原图
m_original = re.findall(res_original,script)
代码如下:
# coding=utf-8
import re
import os
content = '''
<script>var images = [
{ "big":"down/2015/3/18/KDkwMHgp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
"thumb":"down/2015/3/18/KHgxMjAp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
"original":"down/2015/3/18/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg", "title":"","descript":"","id":75109},
{ "big":"down/2015/3/18/KDkwMHgp/fec26de9-8727-424a-b272-f2827669a320.jpg",
"thumb":"down/2015/3/18/KHgxMjAp/fec26de9-8727-424a-b272-f2827669a320.jpg",
"original":"down/2015/3/18/fec26de9-8727-424a-b272-f2827669a320.jpg", "title":"","descript":"","id":75110},
</script>
'''
html_script = r'<script>(.*?)</script>'
m_script = re.findall(html_script,content,re.S|re.M)
for script in m_script:
res_original = r'"original":"(.*?)"' #原图
m_original = re.findall(res_original,script)
for pic_url in m_original:
print pic_url
filename = os.path.basename(pic_url) #去掉⽬录路径,返回⽂件名
urllib.urlretrieve(pic_url, 'E:\\'+filename) #下载图⽚
运⾏结果如下图所⽰,同时下载图⽚⾄E盘。正则表达式获取括号内容
参考⽂章: [python学习] 简单爬取图⽚⽹站图库中图⽚
------------------------------------------------------------------------------------------------------------------------------
9.通过replace过滤<br />标签
在获取值过程中,通常会存<br />标签,它表⽰HTML换⾏的意思。常⽤的⽅法可以通过标签'<'和'>'进⾏过滤,但是这⾥我想讲述的是⼀种Python常⽤的过滤⽅法,在处理中⽂乱码或⼀些特殊字符时,可以使⽤函数replace过滤掉这些字符。核⼼代码如下:
if '<br />' in value:
value = place('<br />','')  #过滤该标签
value = place('\n',' ')        #换⾏空格替代否则总换⾏
例如过滤前后的例⼦:
達洪阿異名: (字) 厚菴<br /> (諡) 武壯<br /> (勇號) 阿克達春巴圖魯
達洪阿異名: (字) 厚菴 (諡) 武壯 (勇號) 阿克達春巴圖魯
------------------------------------------------------------------------------------------------------------------------------
10.获取<img ../>中超链接及过滤<img>标签

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。