Python进击之路-BeautifulSoup

最近在学习爬虫的时候,发现分解源代码的时候很不方便,然后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
'''

这里我加了很多注释,主要也是因为学习过程中希望对每条代码都能了解它的作用


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值