本文做者:魏泯css
個人博客源地址:https://www.cnblogs.com/Asterism-2012/html
效率魔法師,本文最後更新時間:2019年1月9日python
*跳轉到文章結尾*
app
BeautifulSoup4 是一個用於解析和處理XML和HTML的第三方庫
它上手快,操做簡單,功能豐富。
在閱讀本文以前,首先保證你已經安裝了"requests"庫(pip install requests
)。ide
在包含單個Python的操做系統中使用ui
pip install bs4
在包含多個Python版本的操做系統中使用編碼
pip installl bs4 或者 pip3 install bs4
導入相關模塊,發送網頁請求,查看請求狀態url
>>> import requests as req >>> from bs4 import BeautifulSoup >>> r = req.get(url="https://www.baidu.com") >>> r.status_code 200
查看網頁源碼,檢查網頁編碼spa
>>> 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
對象。操作系統
屬性 | 描述 |
---|---|
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>
屬性 | 描述 |
---|---|
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 '關於百度'
名稱 | 描述 |
---|---|
find() | 根據參數找到對應標籤的第一個內容,字符串 |
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>]
>>> 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>]