BeatutifulSoup
先從標籤說起
-
標籤又叫Tag,是書寫前端網頁的語言標記。下圖是你看到的網頁,背後是無數的標籤構成的,每一個標籤規定不同的屬性,如確定文字大小位置等。
-
組成:以 < p class = “title”>這是標籤 < /p>爲例
- < p > … < /p >,這一個成對的符號就是標籤,p就是標籤名稱。一般特定名稱的標籤有特定的功能,不可亂用,若有意,自己瞭解一下
- 內部的“ class = “title” ”就是標籤的屬性,修飾標籤的大小,顏色等特定的屬性
- “…”是標籤內的非屬性字符串,一般是用來輸出顯示的
-
多個標籤組成的叫做“標籤樹”,一個網頁就是一個標籤樹
什麼是BeautifulSoup類
- 下面是獲取百度的網頁內容,以text格式輸出。發現你根本閱讀不了,裏面是沒有格式混亂的標籤。
- 下面是對應的在瀏覽器開發者模式下打開的百度網頁的源碼。你會發現很友好的,是有格式的標籤。
- 通過比對,你會發現,原來混亂的標籤變的有格式的,可以閱讀了。問題來了,瀏覽器可以將標籤格式化,輸入到爬蟲中怎麼將對應的標籤語言格式化?
- BeautifulSoup應運而生,將python爬取回來的網頁混亂的源碼變成漂亮的可讀的格式,生成標籤樹
使用
- 準備好煲湯的材料,response.text對象
from bs4 import BeautifulSoup
import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
- 將材料加入鍋裏,選擇材料的格式html(看看你的網頁是什麼格式)
soup = BeautifulSoup(demo,"html.parser")
- 根據上文你的soup是一個完整的標籤樹,你可以獲取標籤樹裏面的任何內容
print(soup.prettify())
# 輸出完整的標籤樹
print(soup.title)
# 輸出標籤名爲title的標籤
print(soup.a.name)
# 輸出標籤名
print(soup.a.attrs)
# 獲得標籤屬性的信息
print(soup.a.string)
# 輸出標籤中間的字符串
一個html網頁就是一個標籤樹——如何有效地遍歷
- 如下圖,對應的html網頁的基本框架如下圖,你可以根據樹來理解
- 箭頭的頭是兒子結點,箭頭的爲是父親節點,父節點在上,兒子結點在下。title是head的兒子結點,head是title的父親節點
- 遍歷方式,按照樹的形狀纔可有效的進行遍歷
- 先講講自上而下進行遍歷
- 常用方法
屬性 | 說明 |
---|---|
< tag >.contents | 子節點的列表,將< tag >所有的兒子結點存入列表 |
< tag >.children | 子節點的迭代類型,與.contents類似,用於循環遍歷兒子節點 |
< tag >.descendants | 子孫節點的迭代類型,包含所有子孫節點,用於循環遍歷 |
- 先給我一個出發點,調用contents直接輸出所有的兒子結點
from bs4 import BeautifulSoup
import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
print(soup.head.contents)
圖示,以列表的形式輸出所有的兒子標籤:
- < tag >.children迭代的使用,用於遍歷兒子標籤
for i in soup.body.children:
print(i)
圖示,循環遍歷兒子節點
- < tag >.descendants迭代的使用,用於遍歷孫子標籤
for i in soup.body.descendants:
print(i)
圖示,遍歷的不僅僅是兒子節點,更是孫子節點
如果不信,你可以參考一下,下面完整的樹
<html>
<head>
<title>
This is a python demo page
</title>
</head>
<body>
<p class="title">
<b>
The demo python introduces several python courses.
</b>
</p>
<p class="course">
Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">
Basic Python
</a>
and
<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">
Advanced Python
</a>
.
</p>
</body>
</html>
- 再講自下而上進行遍歷
- 常用方法
屬性 | 說明 |
---|---|
< tag >…parent | 節點的父親標籤 |
< tag >.parents | 節點先輩標籤的迭代類型,用於循環遍歷先輩節點 |
- < tag >.parent標籤的使用
print(soup.head.parent)
圖示,爲對應的父親節點,注意這是一個大的節點,< html >< / html >節點
- < tag >.parents 迭代的使用
for parent in soup.p.parents:
print(parent.name)
圖示,迭代的出現,包括了soup類本身
- 最後講講平行遍歷 ,平行遍歷是同一個父親節點的。類似的方法同上
屬性 | 說明 |
---|---|
< tag >.next_sibling | 返回html文本順序的下一個平行節點標籤 |
< tag >.previous_sibling | 返回html文本順序上一個平行的節點的標籤 |
< tag >.next_siblings | 迭代類型,返回按照html順序的所有的後續平行結點的標籤 |
< tag >.previous_siblings | 迭代類型,返回按照html順序的所有的前繼平行結點的標籤 |
- 最後就是如何完整的顯示一個html樹
屬性 | 說明 |
---|---|
< tag >.prettify() | 完整的顯示一個html樹 |
print(soup.body.prettify())
圖示,顯示了body棵樹的全體