python爬蟲 之 BeautifulSoup庫入門

ckxllf發表於2019-12-09

  BeautiSoup類的基本元素及用bs4遍歷HTML基本方法

  1,BeautifulSoup類的基本元素

  有5種基本元素:

  Tag: 標籤,最基本的資訊組織單元, .

  Name: 標籤名字, ..name :返回一個字串

  Attributes: 標籤的屬性, ..attrs :返回一個字典型別

  NavigableString:標籤中的字串, ..string :返回一個字串

  Comment: 標籤中的註釋資訊,會在 ..string中獲得。

  比如現在有一個HTML文件:

  The demo python introduces several python courses.

  Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:

  Basic Python

  and

  Advanced Python.

  This is not a Comment.

  我們對此文件用BS類的基本元素進行應用:

  先煲一鍋湯:>>> soup = BeautifulSoup(html, "html.parser")

  用 .獲得一個標籤的全部資訊:

  如:>>> soup.p

  

在這裡插入圖片描述

  用.name獲得這個標籤的名字:

  如:>>> p.name

  

在這裡插入圖片描述

  Tag屬性還有另外一個重要的用法, 就是當我們對一個標籤內的子節點進行遍歷時,可能會有不是標籤的節點,比如’\n’等,此時可利用bs4庫提供的bs4.element.Tag屬性來進行甄別。

  用到 isinstance()方法。比如:isinstance(soup.a, bs4.element.Tag)

  

在這裡插入圖片描述

  用.attrs獲得這個標籤的屬性:

  如>>> soup.a.attrs

  

在這裡插入圖片描述

  可以對a標籤的具體屬性進行獲得:>>> soup.a['href']

  

在這裡插入圖片描述

  用.string獲得這個標籤中的字串資訊:

  如:>>> soup.p.string:

  

在這裡插入圖片描述

  我們看到.string可以跨越標籤,直接獲得標籤內的字串。

  但是: 當外層標籤內含有多個平行的內層標籤時,就不行了:

  比如: 鄭州人流醫院哪家好

  此p標籤內有多個平行的a標籤,直接用p.string返回為None

  最後,說說Comment屬性

  可用>>> soup.b.string來獲得註釋的資訊:

  二者型別是不同的,因此可用bs4庫的 isinstance(, bs4.element.Comment)來過濾註釋資訊,或者獲得註釋資訊。

  2,用BeautifulSoup遍歷HTML的方式

  1,下行遍歷:

  3個屬性:

  1,.contents : 子節點的列表,將所有兒子節點存入列表(還包括所有的\n)

  2,.children : 子節點的迭代型別,與.contents類似,用於迴圈遍歷兒子節點。

  3, .descendants : 包含所有的子孫節點。與children一樣,只能用於迭代。

  2,上行遍歷:

  2個屬性:

  1,.parent : 節點的父親標籤

  2,.parents: 節點先輩的迭代型別,用於迴圈遍歷先輩節點(所有的先輩)。

  3,平行遍歷:

  4個平行遍歷屬性:(需要發生在同一個父親節點下的各節點間。)

  1,.next_sibling : 返回按照HTML文字順序的下一個平行節點標籤。

  2,.previous_sibling: 返回。。的上一個平行節點標籤。

  3,.next_siblings: 迭代型別, 返回按照順序的所有平行節點標籤。

  4,.previous_sibings:迭代型別 。。。。。。。。。

  3,BeautifulSoup的格式化輸出與編碼:

  prettify()函式:能夠為HTML標籤,文字增加換行符,

  1,世界上的所有資訊都可以用3中標記形式進行標記。

  XML 格式: 類似於HTML,標籤形式。

  JSON: 有型別的鍵值對 key:value 如:

  "name" : "北京" -----;一個鍵值對

  "name" : ["hello", "hello"] -----: 一個鍵對應多個值1

  "name" : {"subkey" : "subvalue"} -----:一個鍵值對作為一個值對應於一個鍵

  YAML: 無型別的鍵值對 : key : value

  name : 北京

  name :

  -newName : 北京

  -newName : 上海 (並列)

  name :

  newname : hello (巢狀)

  比較::

  XML用<>標記 : 擴充套件性好,但是繁瑣。 Internet上的資訊互動與傳遞,多用XML。

  JSON用“” : 資訊有型別,適合程式處理(js),較XML整潔。(無法註釋) 用於移動應用雲端和節點的資訊通訊。用在對程式介面處處理。

  YAML用縮排 : 資訊無型別, 文字資訊比例最高,可讀性好。各類系統的配置檔案,有註釋易讀。

  2,資訊的提取方式

  1,完整解析資訊的標記形式,再提取關鍵資訊。

  2,無視標記形式,直接搜尋關鍵資訊。

  3,融合方法。

  如:提取HTML中所有的URL標籤。

  思路):

  1,搜尋所有的標籤

  2,解析標籤格式,提取href後的連結內容。

  3,find_all()方法

  最常用的查詢方法

  <>.find_all(name, attrs, recursive, string, **kwargs)

  返回一個列表型別,儲存查詢的結果.

  使用方法:

  可單獨指定name,attrs, recursive, string等

  標籤名, 屬性(或字典形式的鍵值對), 預設為對子孫節點搜尋, 字串。

  (..) 等價於 .find_all(..)

  soup(..) 等價於 soup.find_all(..)

  <>.find()搜尋只返回一個結果,字串結果。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2667500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章