最近在学习爬虫的时候,发现分解源代码的时候很不方便,然后BeautifulSoup便进入了我的视野,发现这个还是挺好用的,所有特地来记录一下,以下写了个程序,用来实践看看BeautifulSoup的用处
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间(来自官方)
中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
实例一:爬取百度百科中关于"胡歌"的词条,并将所有包含'view'关键字的链接打印
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import re
#使用正则
def main():
url = "https://baike.baidu.com/search/word?word=%E8%83%A1%E6%AD%8C"
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html,"html.parser")
for each in soup.find_all(href = re.compile("view")):
print(each.text,"->",''.join(["http://baike.baidu.com",each["href"]]))
if __name__ == "__main__":
main()
打印结果:
"""
多肉百科 -> http://baike.baidu.com/wikicategory/view?categoryName=多肉植物
恐龙百科 -> http://baike.baidu.com/wikicategory/view?categoryName=恐龙大全
岑参诗作 -> http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/18074325#viewPageContent
2011年孙凰发行二胡民乐 -> http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/22240446#viewPageContent
锁定 -> http://baike.baidu.com/view/10812319.htm
一念执着 -> http://baike.baidu.com/view/5458338.htm
逍遥叹 -> http://baike.baidu.com/view/345628.htm
一吻天荒 -> http://baike.baidu.com/view/8130305.htm
忘记时间 -> http://baike.baidu.com/view/2492625.htm
六月的雨 -> http://baike.baidu.com/view/34074.htm
光棍 -> http://baike.baidu.com/view/88402.htm
天亮以后 -> http://baike.baidu.com/view/482616.htm
月光 -> http://baike.baidu.com/view/18752.htm
乌云然 -> http://baike.baidu.com/view/1639821.htm
敢不敢爱 -> http://baike.baidu.com/view/2894946.htm
高手 -> http://baike.baidu.com/view/91601.htm
我不做英雄 -> http://baike.baidu.com/view/5930821.htm
-> http://baike.baidu.comhttp://baike.baidu.com/view/12878522.htm
"""
通过上面的代码可以看到已经把包含view关键字的链接加标题都抓取了下来
这就是BeautifulSoup的好处,可以通过tag来搜索我们需要的关键信息
上面的实例太简单了,下面这个实例会进入到前面的每个词条中,看看词条是否具有副标题,如果有就一起打印
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import re
#使用正则
def main():
keyword = "胡歌"
#把胡歌转码成%E8%83%A1%E6%AD%8C
keyword = urllib.parse.urlencode({"word":keyword})
#https://baike.baidu.com/search/word?word=%E8%83%A1%E6%AD%8C
#打开网页
response = urllib.request.urlopen("http://baike.baidu.com/search/word?%s"%keyword)
#获取网页输出
html = response.read()
#使用beautifulsoup读取html
soup = BeautifulSoup(html,"html.parser")
#中文字符
zh_pattern = re.compile(u'[\u4e00-\u9fa5]+')
#开始第二遍的遍历
for each in soup.find_all(href = re.compile("view")):
#find_all 代表全文搜索,find 只会显示一条结果
#href = re.compile("view") 如下例子
#<a target=_blank href=/view/5458338.htm>一念执着</a>
#re.compile('view') 正则匹配有view关键字的链接
content = ''.join([each.text])
#<a href="/wikicategory/view?categoryName=多肉植物" target="_blank">多肉百科<>
#content = 多肉百科
if content == "":
continue
#如果标题为空则中止本次循环
url2 = ''.join(["http://baike.baidu.com",each["href"]])
#拼接新的URL
#(http://baike.baidu.com)+ (/wikicategory/view?categoryName=多肉植物)
# 出现了一个问题,有点链接是完整的,然后再加上前缀就不对了: http://baike.baidu.comhttp://baike.baidu.com/view/12878522.htm
if zh_pattern.search(url2):
continue
#如果url中包含中文则中止本次循环,因为编码不一样就会报错然后结束程序
response2 = urllib.request.urlopen(url2)
html2 = response2.read()
soup2 = BeautifulSoup(html2,"html.parser")
#打开网址如下:
#http://baike.baidu.com/view/482616.htm
#然后获取网页内容
if soup2.h2:
content = ''.join([content,soup2.h2.text])
#如果网页h2标签存在,则重新定义content
#光棍
#光棍(单身人士称谓)
content = ''.join([content,"->",url2])
print(content)
#最后打印完整的内容
#逍遥叹(胡歌演唱歌曲)->http://baike.baidu.com/view/345628.htm
if __name__ == '__main__':
main()
#
"""
岑参诗作(岑参诗作)->http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/18074325#viewPageContent
2011年孙凰发行二胡民乐(2011年孙凰发行二胡民乐)->http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/22240446#viewPageContent
锁定->http://baike.baidu.com/view/10812319.htm
一念执着->http://baike.baidu.com/view/5458338.htm
逍遥叹(胡歌演唱歌曲)->http://baike.baidu.com/view/345628.htm
一吻天荒目录->http://baike.baidu.com/view/8130305.htm
忘记时间目录->http://baike.baidu.com/view/2492625.htm
六月的雨目录->http://baike.baidu.com/view/34074.htm
光棍(单身人士称谓)->http://baike.baidu.com/view/88402.htm
天亮以后->http://baike.baidu.com/view/482616.htm
月光(胡彦斌演唱《秦时明月》系列片头曲)->http://baike.baidu.com/view/18752.htm
乌云然目录->http://baike.baidu.com/view/1639821.htm
敢不敢爱(胡歌演唱歌曲)->http://baike.baidu.com/view/2894946.htm
高手(2005年潘玮柏音乐专辑)->http://baike.baidu.com/view/91601.htm
我不做英雄目录->http://baike.baidu.com/view/5930821.htm
'''
这里我加了很多注释,主要也是因为学习过程中希望对每条代码都能了解它的作用