青魔法Python 驭虫术 bs4(BeautifulSoup4)库
Python 驭虫术 bs4(BeautifulSoup4)库
本文作者:魏泯
我的博客源地址:https://www.cnblogs.com/Asterism-2012/
效率魔法师,本文最后更新时间:2019年1月9日
目录
- 简介与安装
- 使用BeautifulSoup进行数据解析
简介与安装
BeautifulSoup4 是一个用于解析和处理XML和HTML的第三方库
它上手快,操作简单,功能丰富。
在阅读本文之前,首先保证你已经安装了"requests"库(pip install requests
)。
- 安装bs4
在包含单个Python的操作系统中使用
pip install bs4
在包含多个Python版本的操作系统中使用
pip installl bs4 或者 pip3 install bs4
使用BeautifulSoup进行数据解析
导入相关模块,发送网页请求,查看请求状态
>>> import requests as req
>>> from bs4 import BeautifulSoup
>>> r = req.get(url="https://www.baidu.com")
>>> r.status_code
200
查看网页源码,检查网页编码
>>> r.text
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>ç\x99¾åº¦ä¸\x80ä¸\x8bï¼\x8cä½\xa0å°±ç\x9f¥é\x81\x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=ç\x99¾åº¦ä¸\x80ä¸\x8b class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ\x96°é\x97»</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>å\x9c°å\x9b¾</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§\x86é¢\x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å\x90§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>ç\x99»å½\x95</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">ç\x99»å½\x95</a>\');\r\n </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æ\x9b´å¤\x9a产å\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å\x85³äº\x8eç\x99¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>æ\x84\x8fè§\x81å\x8f\x8dé¦\x88</a> 京ICPè¯\x81030173å\x8f· <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
>>>r.encoding
'ISO-8859-1'
>>>r.encoding='utf-8'
>>>r.text
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">登录</a>\');\r\n </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更 多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
BeautifulSoup对象的常用属性
使用BeautifulSoup进行解析后,会返回一个BeautifulSoup
对象。
属性 | 描述 |
---|---|
head | HTML页面的<head> 标签 |
title | HTML页面的<title> 标签 |
body | HTML页面的<body> 标签 |
p | HTML页面的<p> 标签 |
a | HTML页面的<a> 标签 |
>>>soup = BeaurifulSoup(r.text)
>>>soup.p
<p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p>
>>>soup.a
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
Tag标签对象的常用属性
属性 | 描述 |
---|---|
name | 标签的名字,比如title,div,字符串 |
attrs | 包含Tag的所有属性,比如class,src,字典类型 |
contents | Tag下所有子Tag内容 |
string | Tag所包围的文本,字符串 |
值得一提的是:如果Tag内部有超过一层嵌套的标签,string就会返回None。
>>> soup.pstring
>>> soup.p.string
>>> soup.p.contents
[' ', <a href="http://home.baidu.com">关于百度</a>, ' ', <a href="http://ir.baidu.com">About Baidu</a>, ' ']
>>> soup.p.attrs
{'id': 'lh'}
>>> soup.p.a
<a href="http://home.baidu.com">关于百度</a>
>>> soup.p.a.string
'关于百度'
Tag标签对象的find()方法和find_all()方法
名称 | 描述 |
---|---|
find() | 根据参数找到对应标签的第一个内容,字符串 |
find_all() | 根据参数找到所有对应标签信息,列表格式 |
- 使用方法:BeautifulSoup.find_all(参数)
参数 | 描述 |
---|---|
name | 标签的名字,比如title,div,字符串 |
attrs | 包含Tag的所有属性,比如class,src,字典类型 |
recursive | 设置查找层次,之查找当前标签下一层使用False为值 |
string | 按照关键字检索string属性的内容,字符串 |
limit | 返回结果的个数,整型 |
>>> soup.find(name='p')
<p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p>
>>> soup.find_all(name='p')
[<p id="lh"> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> </p>, <p id="cp">©2017 Baidu <a href="http://www.baidu.com/duty/">使用百度前必读</a> <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a> 京ICP证030173号 <img src="//www.baidu.com/img/gs.gif"/> </p>]
- 使用find_all()进行页面超链接检索,举一反三:
>>> import re
>>> httpsUrl = soup.find_all(attrs={'href':re.compile('https')})
>>> httpsUrl
[<link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>, <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a>]
——向前走吧,往往最珍贵的东西都不容易在表层浮现的事物找到。