这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法。它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬虫、BeautifulSoup分析网页DOM节点,这就更方便了,但本文更多的是介绍基于正则的底层爬取分析。
涉及内容如下:
常用正则表达式爬取网页信息及HTML分析总结
1.获取标签之间内容
2.获取超链接之间内容
3.获取URL最后一个参数命名图片或传递参数
4.爬取网页中所有URL链接
5.爬取网页标题title两种方法
6.定位table位置并爬取属性-属性值
7.过滤等标签
8.获取' 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盘。
参考文章:
https://blog.csdn.net/eastmount/article/details/44492787
9.通过replace过滤 标签
在获取值过程中,通常会存 标签,它表示HTML换行的意思。常用的方法可以通过标签'<'和'>'进行过滤,但是这里我想讲述的是一种Python常用的过滤方法,在处理中文乱码或一些特殊字符时,可以使用函数replace过滤掉这些字符。核心代码如下:
if ' ' in value: value = value.replace(' ','') #过滤该标签 value = value.replace('\n',' ') #换行空格替代 否则总换行
例如过滤前后的例子:
達洪阿 異名: (字) 厚菴 (諡) 武壯 (勇號) 阿克達春巴圖魯 達洪阿 異名: (字) 厚菴 (諡) 武壯 (勇號) 阿克達春巴圖魯
10.获取中超链接及过滤标签
在获取值属性值过程中,可能在分析table/tr/th/td标签后,仍然存在图片链接,此时在获取文字内容时,你可能需要过滤掉这些标签。这里采用的方法如下:
value = re.sub('<[^>]+>','', value)
例如:
#encoding:utf-8 import os import re
value = ''' table class='infobox' style='width: 21em; text-align: left;' cellpadding='3'> tr bgcolor='#CDDBE8'> th colspan='2'> center class='role'>b>中華民國政治人士b>br />center> th> tr> tr> th>性別:th> td>男td> tr> tr> th>政黨:th> td>span class='org'> img alt='中國國民黨' src='../../../../images/Kuomintang.svg.png' width='19' height='19' border='0' /> a href='../../../../articles/%8B%E6%B0%91%E9%BB%A8.html' title='中國國民黨'>中國國民黨a>span>td> tr> table> '''
value = re.sub('[^>]+>','', value) #过滤HTML标签 print value
输出如下:
>>>
中華民國政治人士
性別: 男
政黨:
中國國民黨
>>>
虽然仅仅包括汉字,但是中间会存在换行,需要过滤 即可:
if ' ' in value: value = value.replace(' ','') value = value.replace('\n',' ') value = re.sub('<[^>]+>','', value) #过滤HTML标签 print value
#输出仅仅一行如下: #中華民國政治人士 性別: 男 政黨: 中國國民黨
下面讲述第二部分,通过正则表达式获取中的src超链接,代码如下:
test = '''''' print re.findall('src='(.*?)'',test)
输出如下所示:
>>> ['../images/Kuomintang.png'] >>>
findall函数返回的总是正则表达式在字符串中所有匹配结果的列表,即findall中返回列表中每个元素包含的信息。
最后希望文章对你有所帮助,后面如果遇到新的相关知识,我也会即使的更新添加的。
|