python網絡爬蟲學習筆記(二)BeautifulSoup庫

Beautiful Soup庫也稱爲beautiful4庫、bs4庫,它可用於解析HTML/XML,並將全部文件、字符串轉換爲'utf-8'編碼。HTML/XML文檔是與「標籤樹一一對應的。具體地說,Beautiful Soup庫是能夠解析、遍歷、維護HTML/XML文件的「標籤樹」的功能庫。本文總結了BeautifulSoup的基本使用方法。html

1、Beautiful Soup庫基本元素


庫的比較常見的引用方式以下html5

from bs4 import BeautifulSoup #從Beautiful Soup庫引入BeautifulSoup類
import bs4 #直接引入Beautiful Soup庫

Beautiful Soup庫可用的解析器有如下4種:python

  • bs4的HTML解析器:BeautifulSoup(mk, 'html.parser')
  • lxml的HTML解析器:BeautifulSoup(mk, 'lxml')
  • lxml的XML解析器:BeautifulSoup(mk, 'xml')
  • html5lib的解析器:BeautifulSoup(mk, 'html5lb')

BeautifulSoup類對應一個HTML/XML文檔的所有內容,其5種基本元素羅列以下:python爬蟲

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

下面一段運行實例,其中demo是一段HTML代碼框架

咱們看一下a標籤,其父標籤以及祖父標籤的名字學習

接下來,解析a標籤的屬性網站

從中能夠看到,屬性是字典類型。編碼

再看一看標籤自己的類型spa

標籤的NavigableString元素3d

獲取標籤的Comment(與獲取NavigableString比較)

p標籤包含b標籤,然而p.string並不包含b標籤,這說明NavigableString是能夠跨越多個標籤層次的。

2、利用Beautiful Soup庫遍歷HTML內容


前面提到,HTML文檔其實就是一棵標籤樹。對HTML的遍歷便是對標籤樹的遍歷。遍歷的方式分爲上行遍歷、下行遍歷和平行遍歷。

2.1 標籤樹的下行遍歷

標籤樹的下行遍歷包含三個屬性

  • .contents:子節點的列表,將<tag>全部兒子節點存入列表
  • .children:子節點的迭代類型,與.content類似,用於循環遍歷兒子節點
  • .descendants:子孫節點的迭代類型,包含全部子孫節點,用於循環遍歷

 使用.contents獲取子節點列表的示例以下

通常地,若是要遍歷子節點,能夠用以下代碼框架

for child in soup.body.children:
    print(child)

若是要遍歷子孫節點,則能夠用以下代碼框架

for child in soup.body.descendents:
    print(child)

2.2 標籤樹的上行遍歷

上行遍歷包含的屬性羅列以下:

  • .parent:節點的父親標籤
  • .parents:節點先輩標籤的迭代模型,用於循環遍歷先輩節點

下面是使用.parent獲取父標籤的一段實例

 

這裏看到,html是最高級的標籤,所以其父標籤即爲本身。

通常地,對標籤樹進行上行遍歷,可採用以下代碼框架

for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

相應給出一段運行實例:打印全部先輩標籤的名字

2.3 標籤樹的平行遍歷

Beautiful Soup庫提供如下四種平行遍歷屬性:

  • .next_sibling:返回按照HTML文本順序的下一個平行節點標籤
  • .previous_sibling:返回按照HTML文本順序的上一個平行節點標籤
  • .next_siblings:迭代類型,返回按照HTML文本順序的後續全部平行節點標籤
  • .previous_siblings:迭代類型,返回按照HTML文本順序的前續全部平行節點標籤

值得注意的是,平行遍歷是在同一個父節點下創建的。

一段運行實例

最後,soup.a.previous_sibling.previous_sibling沒有輸出,說明a標籤的前一個再前一個節點標籤爲空。

通常地,標籤樹的平行遍歷可採用以下代碼框架

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

3、基於Beautiful Soup庫的HTML格式輸出 


bs4庫提供了prettify()方法,用於對HTML的內容給出更友好的輸出。

下面是一段運行實例

看到pretiffy()在每一個標籤後添加了換行符'\n'。將相關信息打印出來,獲得以下結果

prettify()也能夠對某一個標籤進行處理,示例以下

 

 

相關內容爲筆者根據中國大學MOOC網站嵩天教授的python爬蟲課程所撰寫的學習筆記,感謝中國MOOC學習平臺提供的學習資源與嵩老師的授課。

相關文章
相關標籤/搜索