Python之Beautiful Soup庫

  • Beautiful Soup庫是解析、遍歷、維護“標簽樹”的功能庫
  • BeautifulSoup對應一個HTML/XML文檔的全部內容
  • Beautiful Soup庫也叫beautifulsoup4 或 bs4 約定引用方式如下,即主要是用BeautifulSoup類
from bs4 import BeautifulSoup
import bs4

安裝

pip install beautifulsoup4

解析器

解析器 使用方法 條件
bs4的HTML解析器 BeautifulSoup(mk,'html.parser') 安裝bs4庫
lxml的HTML解析器 BeautifulSoup(mk,'lxml') pip install lxml
lxml的XML解析器 BeautifulSoup(mk,'xml') pip install lxml
html5lib的解析器 BeautifulSoup(mk,'html5lib') pip install html5lib

基本元素

基本元素 說明
Tag 標簽,最基本的信息組織單元,分別用<>和</>標明開頭和結尾
Name 標簽的名字,<p>...</p>的名字是'p',格式:<tag>.name
Attributes 標簽的屬性,字典形式組織,格式:<tag>.attrs
NavigableString 標簽內非屬性字符串,<>...</>中字符串,格式:<tag>.string
Comment 標簽內字符串的注釋部分,一種特殊的Comment類型

使用方法

import requests
from bs4 import BeautifulSoup

r = requests.get("http://python123.io/ws/demo.html")
demo = r. text
soup = BeautifulSoup(demo, 'html.parser')
tag
print(soup.title)
print(soup.a)
name
print(soup.a.name)
print(soup.a.parent.name)

attrs(屬性)
print(soup.a.attrs)
print(soup.a.attrs['class'])
print(type(soup.a.attrs))
NavigableString
print(soup.p)
print(soup.p.string)
print(type(soup.p.string))
Comment
#newsoup = BeautifulSoup("<b><!--This is a comment.--></b><p>This is not a comment</p>","html.parser")
print(newsoup.b.string)
print(type(newsoup.b.string)
print(newsoup.p.string)
print(type(newsoup.p.string))

HTML的內容遍歷

HTML基本格式@2x.png

HTML樹形結構@2x.png
遍歷圖解@2x.png
下行遍歷
屬性 說明
.contents 子節點的列表,將<tag>所有兒子節點存入列表
.children 子節點的迭代類型,與.contents類似,用于循環遍歷兒子節點
.descendants 子孫節點的迭代類型,包含所有子孫節點,用于循環遍歷
print(soup.head)
print(soup.head.contents)
print(soup.body.contents)
print(len(soup.body.contents))
print(soup.body.contents[1])

# 遍歷兒子節點
for child in soup.body.children:
    print(child)

# 遍歷子孫節點
for child in soup.body.descendants:
    print(child)
上行遍歷
屬性 說明
.parent 節點的父親標簽
.parents 節點先輩標簽的迭代類型,用于循環遍歷先輩節點
 print(soup.title.parent)

 for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)
平行遍歷
屬性 說明
.next_sibling 返回按照HTML文本順序的下一個平行節點標簽
.previous_sibling 返回按照HTML文本順序的上一個平行節點標簽
.next_siblings 迭代類型,返回按照HTML文本順序的后續所有平行節點標簽
.previous_sibling 迭代類型,返回按照HTML文本順序的前續所有平行節點標簽
print(soup.a.next_sibling)
print(soup.a.next_sibling.next_sibling)
print(soup.a.previous_sibling)
print(soup.a.previous_sibling.previous_sibling)
print(soup.a.parent)


# 遍歷后續節點
for sibling in soup.a.next_siblings:
    print(sibling)

# 遍歷前續節點
for sibling in soup.a.previous_siblings:
    print(sibling)

格式輸出

bs4庫的prettify()方法:
  • .prettify()為HTML文本<>及其內容增加更加'\n'
  • .prettify()可用于標簽,方法:<tag>.prettify()
print(soup.prettify())
print(soup.a.prettify())
bs4庫的編碼
  • bs4庫將任何HTML輸入都變成utf‐8編碼
  • Python 3.x默認支持編碼是utf‐8,解析無障礙
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容