青魔法Python 馭蟲術 bs4(BeautifulSoup4)庫

Python 馭蟲術 bs4(BeautifulSoup4)庫

本文做者:魏泯css

個人博客源地址:https://www.cnblogs.com/Asterism-2012/html

效率魔法師,本文最後更新時間:2019年1月9日python

*跳轉到文章結尾*app

目錄

  • 簡介與安裝
  • 使用BeautifulSoup進行數據解析

簡介與安裝

BeautifulSoup4 是一個用於解析和處理XML和HTML的第三方庫
它上手快,操做簡單,功能豐富。
在閱讀本文以前,首先保證你已經安裝了"requests"庫(pip install requests)。ide

  • 安裝bs4

在包含單個Python的操做系統中使用ui

pip install bs4

在包含多個Python版本的操做系統中使用編碼

pip installl bs4 或者 pip3 install bs4

使用BeautifulSoup進行數據解析

導入相關模塊,發送網頁請求,查看請求狀態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&amp;tpl=mn&amp;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>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>æ\x84\x8fè§\x81å\x8f\x8dé¦\x88</a>&nbsp;京ICPè¯\x81030173å\x8f·&nbsp; <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&amp;tpl=mn&amp;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>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必讀</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意見反饋</a>&nbsp;京ICP證030173號&nbsp; <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>]

*回到文章目錄再看看*

相關文章
相關標籤/搜索