Python爬蟲之BeautifulSoup模塊

模塊安裝

pip3 install beautifulsoup4

模塊導入

from bs4 import BeautifulSoup

示例html內容

獲取html內容代碼

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 115Browser/9.0.0"
}
response = requests.get("https://www.xbiquge6.com/xbqgph.html",headers=headers)
response.encoding = "utf-8"
html = response.text
print(html)

獲取的html內容

<script type="text/javascript" src="/js/m.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>經典小說排行榜-新筆趣閣</title>
<meta name="keywords" content="新筆趣閣,小說排行榜">
<meta name="description" content="新筆趣閣是廣大書友最值得收藏的小說排行榜閱讀網,網站收錄了當前最火熱的小說排行榜,免費提供高質量的小說最新章節,是廣大網絡小說愛好者必備的小說閱讀網。">
<meta http-equiv="Cache-Control" content="no-siteapp">
<meta http-equiv="Cache-Control" content="no-transform">
<link rel="stylesheet" href="/css/xbqg.css">
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="/js/xbqg.js"></script>


<div id="wrapper">
	<script>login();</script>
	<div class="header">
		<div class="header_logo">
			<a href="/">新筆趣閣</a>
		</div>
		<script>panel();</script>
	</div>
	<div class="clear"></div>
	<div class="nav">
		<ul>
			<li><a href="/">首頁</a></li>
			<li><a href="/evercase.html">永久書架</a></li>
			<li><a href="/xclass/1/1.html">玄幻奇幻</a></li>
			<li><a href="/xclass/2/1.html">武俠仙俠</a></li>
			<li><a href="/xclass/3/1.html">都市言情</a></li>
			<li><a href="/xclass/4/1.html">歷史軍事</a></li>
			<li><a href="/xclass/5/1.html">科幻靈異</a></li>
			<li><a href="/xclass/6/1.html">網遊競技</a></li>
			<li><a href="/xclass/7/1.html">女頻頻道</a></li>
			<li><a href="/quanben/">完本小說</a></li>
			<li><a href="/xbqgph.html">排行榜單</a></li>
			<li><a href="/xbqgcase.html">臨時書架</a></li>
		</ul>
	</div>
	<div id="main">
		<div class="novelslist2">
		<h2>小說排行榜列表</h2>
		<ul>
			<li><span class="s1"><b>做品分類</b></span><span class="s2"><b>做品名稱</b></span><span class="s3"><b>最新章節</b></span><span class="s4"><b>做者</b></span><span class="s5"><b>更新時間</b></span><span class="s6"><b>狀態</b></span></li>
			
			<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/78_78760/" target="_blank">我本港島電影人</a></span><span class="s3"><a href="/78_78760/1203299.html" target="_blank">今天有更</a></span><span class="s4">再來一盤菇涼</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/1/1.html">玄幻奇幻</a>]</span><span class="s2"><a href="/90_90002/" target="_blank">艾澤拉斯新秩序</a></span><span class="s3"><a href="/90_90002/350275.html" target="_blank">第一百三十六章 卡拉讚的收穫</a></span><span class="s4">想靜靜的頓河</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/90_90842/" target="_blank">超級狂婿</a></span><span class="s3"><a href="/90_90842/350271.html" target="_blank">第654章:他未入流</a></span><span class="s4">我本幸運</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/90_90305/" target="_blank">我在都市修個仙</a></span><span class="s3"><a href="/90_90305/339101.html" target="_blank">完本感言</a></span><span class="s4">一劍蕩清風</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/75_75283/" target="_blank">都市超級醫聖</a></span><span class="s3"><a href="/75_75283/4165727.html" target="_blank">第2613章 戰後處理</a></span><span class="s4">斷橋殘雪</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/90_90235/" target="_blank">祖傳土豪系統</a></span><span class="s3"><a href="/90_90235/350262.html" target="_blank">第二百零五章 我能試試嗎</a></span><span class="s4">第九傾城</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/83_83534/" target="_blank">都市紅粉圖鑑</a></span><span class="s3"><a href="/83_83534/838632.html" target="_blank">第1510章 我,纔是坐館龍頭!</a></span><span class="s4">秋江獨釣</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/2/1.html">武俠仙俠</a>]</span><span class="s2"><a href="/89_89635/" target="_blank">勝天傳奇</a></span><span class="s3"><a href="/89_89635/998995.html" target="_blank">第三百八十章 遊歷天宮</a></span><span class="s4">騎牛者</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/88_88085/" target="_blank">總裁爸比從天降</a></span><span class="s3"><a href="/88_88085/998993.html" target="_blank">第1748章 奈何本身是婆婆</a></span><span class="s4">一碟茴香豆</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
			<li><span class="s1">[<a href="/xclass/1/1.html">玄幻奇幻</a>]</span><span class="s2"><a href="/89_89996/" target="_blank">太古魔帝</a></span><span class="s3"><a href="/89_89996/998988.html" target="_blank">第一千三百二十四章 魂帝</a></span><span class="s4">草根</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
			
		</ul>
		</div>
		<div class="clear"></div>
	</div>
</div>
<div class="footer">
    <div class="footer_cont"><script>footer();dl();</script></div>
</div>

構建BeautifulSoup對象

經常使用四種解釋器 | 解釋器 | 標識 | 特色|
|--|--|--| | Python標準庫 | html.parser | Python內置,執行速度中 |
| lxml的HTML解釋器 | lxml | 速度快 |
| lxml的XML解釋器 | xml | 惟一支持XML解析 |
| html5lib | html5lib | 容錯性最好,以瀏覽器方式解析 |javascript

soup = BeautifulSoup(html, 'html.parser')

還能夠解析本地html文件css

soup1 = BeautifulSoup(open('index.html'))

.prettify()格式化輸出節點

html

經過 . 獲取節點

title = soup.head.title
print(type(title))
print(title)

結果是
<class 'bs4.element.tag'>
<title>經典小說排行榜-新筆趣閣</title>

對於名稱惟一的節點,能夠省略層級html5

title = soup.title
print(type(title))
print(title)

結果一樣是
<class 'bs4.element.tag'>
<title>經典小說排行榜-新筆趣閣</title>

名稱不惟一的節點,直接獲取只會獲取第一個匹配的節點java

li = soup.li
print(li)

結果是
<li><a href="/">首頁</a></li>

find_all根據條件獲取節點

find_all( name , attrs , recursive , text , **kwargs )
name :查找全部名字爲 name 的tag,字符串對象會被自動忽略掉;
attrs:根據屬性查詢,使用字典類型;
text :能夠搜搜文檔中的字符串內容.與 name 參數的可選值同樣, text 參數接受 字符串 , 正則表達式 , 列表, True ;
recursive:調用tag的 find_all() 方法時,Beautiful Soup會檢索當前tag的全部子孫節點,若是隻想搜索tag的直接子節點,可使用參數 recursive=False ;
limit:find_all() 方法返回所有的搜索結構,若是文檔樹很大那麼搜索會很慢.若是咱們不須要所有結果,可使用 limit 參數限制返回結果的數量.效果與SQL中的limit關鍵字相似,當搜索到的結果數量達到 limit 的限制時,就中止搜索返回結果;
class_ :經過 class_ 參數搜索有指定CSS類名的tag,class_ 參數一樣接受不一樣類型的 過濾器 ,字符串,正則表達式,方法或 True。

根據標籤名字

lis = soup.find_all(name="li")
for item in lis:
    print(item)

結果是
<li><a href="/">首頁</a></li>
<li><a href="/evercase.html">永久書架</a></li>
<li><a href="/xclass/1/1.html">玄幻奇幻</a></li>
<li><a href="/xclass/2/1.html">武俠仙俠</a></li>
<li><a href="/xclass/3/1.html">都市言情</a></li>
<li><a href="/xclass/4/1.html">歷史軍事</a></li>
<li><a href="/xclass/5/1.html">科幻靈異</a></li>
<li><a href="/xclass/6/1.html">網遊競技</a></li>
<li><a href="/xclass/7/1.html">女頻頻道</a></li>
<li><a href="/quanben/">完本小說</a></li>
<li><a href="/xbqgph.html">排行榜單</a></li>
<li><a href="/xbqgcase.html">臨時書架</a></li>
<li><span class="s1"><b>做品分類</b></span><span class="s2"><b>做品名稱</b></span><span class="s3"><b>最新章節</b></span><span class="s4"><b>做者</b></span><span class="s5"><b>更新時間</b></span><span class="s6"><b>狀態</b></span></li>
<li><span class="s1">[<a href="/xclass/3/1.html">都市言情</a>]</span><span class="s2"><a href="/90_90590/" target="_blank">我能舉報萬物</a></span><span class="s3"><a href="/90_90590/361969.html" target="_blank">第九十六章 巡撫視察【第三更】</a></span><span class="s4">必火</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/5/1.html">科幻靈異</a>]</span><span class="s2"><a href="/81_81279/" target="_blank">女戰神的黑包羣</a></span><span class="s3"><a href="/81_81279/1140238.html" target="_blank">第3046章 惡毒女配,在線提刀45</a></span><span class="s4">二謙</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/1/1.html">玄幻奇幻</a>]</span><span class="s2"><a href="/89_89699/" target="_blank">花崗岩之怒</a></span><span class="s3"><a href="/89_89699/999707.html" target="_blank">第一百五十二章 意外到來的斷劍</a></span><span class="s4">咱的小刀</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/6/1.html">網遊競技</a>]</span><span class="s2"><a href="/77_77363/" target="_blank">超神機械師</a></span><span class="s3"><a href="/77_77363/1338182.html" target="_blank">1090 韭菜的自覺</a></span><span class="s4">齊佩甲</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/2/1.html">武俠仙俠</a>]</span><span class="s2"><a href="/59_59644/" target="_blank">無量真途</a></span><span class="s3"><a href="/59_59644/3199234.html" target="_blank">第六百三十二章 忽然出現的神智</a></span><span class="s4">燕十千</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/5/1.html">科幻靈異</a>]</span><span class="s2"><a href="/88_88061/" target="_blank">個人細胞監獄</a></span><span class="s3"><a href="/88_88061/999706.html" target="_blank">第四百五十九章 白霧</a></span><span class="s4">穿黃衣的阿肥</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/2/1.html">武俠仙俠</a>]</span><span class="s2"><a href="/88_88375/" target="_blank">前任無雙</a></span><span class="s3"><a href="/88_88375/999705.html" target="_blank">第三百章 事急速辦</a></span><span class="s4">躍千愁</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/2/1.html">武俠仙俠</a>]</span><span class="s2"><a href="/90_90719/" target="_blank">元陽道君</a></span><span class="s3"><a href="/90_90719/361968.html" target="_blank">第四十章 洞開</a></span><span class="s4">劍扼虛空</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/4/1.html">歷史軍事</a>]</span><span class="s2"><a href="/88_88151/" target="_blank">逆成長巨星</a></span><span class="s3"><a href="/88_88151/999704.html" target="_blank">655:不是辦法的辦法</a></span><span class="s4">葛洛夫街兄弟</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>
<li><span class="s1">[<a href="/xclass/4/1.html">歷史軍事</a>]</span><span class="s2"><a href="/89_89303/" target="_blank">承包大明</a></span><span class="s3"><a href="/89_89303/999703.html" target="_blank">第一百九十三章 真會玩</a></span><span class="s4">南希北慶</span><span class="s5">2019-11-16</span><span class="s6">連載中</span></li>

根據標籤屬性

屬性和值以字典形式傳入python

lis = soup.find_all(attrs={"class":"s2"})
for item in lis:
    print(item)

結果是
<span class="s2"><b>做品名稱</b></span>
<span class="s2"><a href="/90_90590/" target="_blank">我能舉報萬物</a></span>
<span class="s2"><a href="/81_81279/" target="_blank">女戰神的黑包羣</a></span>
<span class="s2"><a href="/89_89699/" target="_blank">花崗岩之怒</a></span>
<span class="s2"><a href="/77_77363/" target="_blank">超神機械師</a></span>
<span class="s2"><a href="/59_59644/" target="_blank">無量真途</a></span>
<span class="s2"><a href="/88_88061/" target="_blank">個人細胞監獄</a></span>
<span class="s2"><a href="/88_88375/" target="_blank">前任無雙</a></span>
<span class="s2"><a href="/90_90719/" target="_blank">元陽道君</a></span>
<span class="s2"><a href="/88_88151/" target="_blank">逆成長巨星</a></span>
<span class="s2"><a href="/89_89303/" target="_blank">承包大明</a></span>

限制搜索範圍

find_all 方法會搜索當前標籤的全部子孫節點,若是隻想搜索直接子節點,可使用參數 recursive=Falsejquery

遍歷獲取子節點

.contents獲取全部子節點

以列表形式返回全部子節點,要注意,列表裏面還會摻雜 '\n'程序員

ul = soup.ul
print(ul)
print(ul.contents)

結果是
<ul>
<li><a href="/">首頁</a></li>
<li><a href="/evercase.html">永久書架</a></li>
<li><a href="/xclass/1/1.html">玄幻奇幻</a></li>
<li><a href="/xclass/2/1.html">武俠仙俠</a></li>
<li><a href="/xclass/3/1.html">都市言情</a></li>
<li><a href="/xclass/4/1.html">歷史軍事</a></li>
<li><a href="/xclass/5/1.html">科幻靈異</a></li>
<li><a href="/xclass/6/1.html">網遊競技</a></li>
<li><a href="/xclass/7/1.html">女頻頻道</a></li>
<li><a href="/quanben/">完本小說</a></li>
<li><a href="/xbqgph.html">排行榜單</a></li>
<li><a href="/xbqgcase.html">臨時書架</a></li>
</ul>
['\n', <li><a href="/">首頁</a></li>, '\n', <li><a href="/evercase.html">永久書架</a></li>, '\n', <li><a href="/xclass/1/1.html">玄幻奇幻</a></li>, '\n', <li><a href="/xclass/2/1.html">武俠仙俠</a></li>, '\n', <li><a href="/xclass/3/1.html">都市言情</a></li>, '\n', <li><a href="/xclass/4/1.html">歷史軍事</a></li>, '\n', <li><a href="/xclass/5/1.html">科幻靈異</a></li>, '\n', <li><a href="/xclass/6/1.html">網遊競技</a></li>, '\n', <li><a href="/xclass/7/1.html">女頻頻道</a></li>, '\n', <li><a href="/quanben/">完本小說</a></li>, '\n', <li><a href="/xbqgph.html">排行榜單</a></li>, '\n', <li><a href="/xbqgcase.html">臨時書架</a></li>, '\n']

.children獲取全部子節點

返回一個list生成器對象正則表達式

ul = soup.ul
print(ul.children)
print(list(ul.children))

結果是
['\n', <li><a href="/">首頁</a></li>, '\n', <li><a href="/evercase.html">永久書架</a></li>, '\n', <li><a href="/xclass/1/1.html">玄幻奇幻</a></li>, '\n', <li><a href="/xclass/2/1.html">武俠仙俠</a></li>, '\n', <li><a href="/xclass/3/1.html">都市言情</a></li>, '\n', <li><a href="/xclass/4/1.html">歷史軍事</a></li>, '\n', <li><a href="/xclass/5/1.html">科幻靈異</a></li>, '\n', <li><a href="/xclass/6/1.html">網遊競技</a></li>, '\n', <li><a href="/xclass/7/1.html">女頻頻道</a></li>, '\n', <li><a href="/quanben/">完本小說</a></li>, '\n', <li><a href="/xbqgph.html">排行榜單</a></li>, '\n', <li><a href="/xbqgcase.html">臨時書架</a></li>, '\n']

.descendants遍歷全部子孫節點

ul = soup.ul
for item in ul.descendants:
	print(item)

結果是(中間不少'\n'空行我刪掉了)
<li><a href="/">首頁</a></li>
<a href="/">首頁</a>
首頁
<li><a href="/evercase.html">永久書架</a></li>
<a href="/evercase.html">永久書架</a>
永久書架
<li><a href="/xclass/1/1.html">玄幻奇幻</a></li>
<a href="/xclass/1/1.html">玄幻奇幻</a>
玄幻奇幻
<li><a href="/xclass/2/1.html">武俠仙俠</a></li>
<a href="/xclass/2/1.html">武俠仙俠</a>
武俠仙俠
<li><a href="/xclass/3/1.html">都市言情</a></li>
<a href="/xclass/3/1.html">都市言情</a>
都市言情
<li><a href="/xclass/4/1.html">歷史軍事</a></li>
<a href="/xclass/4/1.html">歷史軍事</a>
歷史軍事
<li><a href="/xclass/5/1.html">科幻靈異</a></li>
<a href="/xclass/5/1.html">科幻靈異</a>
科幻靈異
<li><a href="/xclass/6/1.html">網遊競技</a></li>
<a href="/xclass/6/1.html">網遊競技</a>
網遊競技
<li><a href="/xclass/7/1.html">女頻頻道</a></li>
<a href="/xclass/7/1.html">女頻頻道</a>
女頻頻道
<li><a href="/quanben/">完本小說</a></li>
<a href="/quanben/">完本小說</a>
完本小說
<li><a href="/xbqgph.html">排行榜單</a></li>
<a href="/xbqgph.html">排行榜單</a>
排行榜單
<li><a href="/xbqgcase.html">臨時書架</a></li>
<a href="/xbqgcase.html">臨時書架</a>
臨時書架

獲取其父節點

a = soup.li.a
print(a)
p = a.parent
print(p)

結果是
<a href="/">首頁</a>
<li><a href="/">首頁</a></li>

提取節點信息

節點名稱

感受沒什麼用編程

title = soup.title
print(title.name)

結果是
title

節點屬性

a = soup.li.a
print(a)
print(a.attrs)	# 獲取全部屬性,返回字典形式
print(a['href'])# 獲取a節點的href屬性值

結果是
<a href="/">首頁</a>
{'href': '/'}
/

節點文本

a = soup.li.a
print(type(a.string)) # 節點內文本的類型
print(a.string) # 獲取節點內的文本內容
print(a.get_text())	# 也是獲取節點內的文本內容
結果是
<class 'bs4.element.navigablestring'>
首頁

注意!!!若是節點內文本是註釋,則用string取出文本時會自動去除註釋標記 註釋的類型:<class 'bs4.element.comment'>,能夠經過類型判斷

遍歷獲取全部子孫節點中的文本

for string in soup.stripped_strings:  # 去除多餘空白內容
    print(repr(string))

> 想進一步瞭解編程開發相關知識,與我一同成長進步,請關注個人公衆號「松果倉庫」,共同分享宅&程序員的各種資源,謝謝!!!</class></class></class></class>

相關文章
相關標籤/搜索