python爬蟲的BeautifulSoup的使用方法(自己精簡的,只留下了實用的)

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棵樹的全體

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章