1. 程式人生 > >從BeautifulSoup說起

從BeautifulSoup說起

html文檔 str ble example blog demo man 兩種方法 run

BeautifulSoup是解析、遍歷、維護“標簽樹”的功能庫

一、html基礎

1. HTML 標題(Heading)是通過<h1> - <h6> 標簽來定義的.

舉個栗子:<h1>這是一個標題</h1> <h2>這是一個標題</h2> <h3>這是一個標題</h3>

2. HTML 段落是通過標簽 <p> 來定義的.

舉個栗子:<p>這是一個段落。</p> <p>這是另外一個段落。</p>

3. HTML 鏈接 HTML 鏈接是通過標簽 <a> 來定義的.

舉個栗子:<a href="http://www.runoob.com">這是一個鏈接</a>

在 href 屬性中指定鏈接的地址。

4. HTML 圖像是通過標簽 <img> 來定義的.

舉個栗子:<img src="/images/logo.png" width="258" height="39" />

註意: 圖像的名稱和尺寸是以屬性的形式提供的。

5. <body>定義了一個主 體

一般而言,html的結構為:

<html>   標簽樹
    <body>
        <p class = "title">....</p>
    <body>
</html>

示意圖如下

技術分享

二、正式說beutifulSoup庫

1. 一般導入用 from bs4 import BeautifulSoup

2. BeautifulSoup類的五個基本元素(每個部分即對應html的一個部分)

技術分享

3. tag的方法:soup.<tag>訪問獲得HTML中的標簽,當HTML文檔中存在多個相同的<tag>對應的內容時,soup.<tag>返回第一個

下面以這段html源碼為例子:

1 <html><head><title>This is a python demo page</
title></head> 2 <body> 3 <p class="title"><b>The demo python introduces several python courses.</b></p> 4 <p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses: 5 <a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p> 6 </body></html>

python代碼,導入模塊

import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/demo.html")
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
taga = soup.a ###即a標簽的內容

3.1 <tag>.name 標簽的名字,得到的為字符串類型,<p>...</p>的名字為p

eg.

soup.a.name
>>‘a‘

3.2 <tag>.attrs 標簽的屬性,字典形式的組織

taga = soup.a
taga.attrs ##由此可見一個標簽可以有多個屬性
>>{id : link1, class : [py1], href : http://.....}
taga.attrs[id] #標簽的屬性為字典類型,從而屬性是成對出現
>>link1

3.3 <tag>.string 標簽內非屬性字符串(NavigableString),他有時可以跨越多個層次, 結果是<>....</>中的字符串,尖括號內的內容可能是單單一個標簽名,也可能是加了一大堆屬性

eg.

技術分享

3.4 tag的comment,標簽內字符串的註釋部分,一種特殊的comment類

技術分享

總結起來就是最後這幅圖,而且後三種元素都相當與在tag之下才能使用,分別可以用到標簽名,屬性,NavigableString,commen

技術分享

三、標簽樹遍歷方法

技術分享

1 標簽樹的下行遍歷

1.1 下行遍歷主要是三種方法:<tag>.contents、children、descendants

<tag>.contents 子節點的列表,將<tag>所有子節點存入列表

.children子節點的叠代類型,與.contents類似,用於循環遍歷子節點

.desendants子孫節點的叠代類型,包含所有子孫節點,用於循環遍歷

下行遍歷的兩個方法

1.2 (1)遍歷子節點

for child in soup.body.contents
    print(child)

(2)遍歷孫節點

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

2 標簽樹的上行遍歷

2.1 上行遍歷的兩個方法:<tag>.parent,<tag>.parents

.parent 節點的父親標簽

parents節點先輩標簽的叠代類型,用於循環遍歷先輩節點

2.2 上行遍歷的例子

soup=BeautifulSoup(demo,"html.parser")
for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

此方法會遍歷先輩節點,包括soup本身,所以要區別判斷

3. 標簽樹的平行遍歷(平行的前提是在同一個父節點下邊)

3.1 標簽樹平行遍歷的屬性

.next_sibling 返回按照HTML文本順序的下一個平行節點標簽

.previous_sibling返回按照HTML文本順序的上一個平行節點標簽

.next_siblings叠代類型,返回按照HTML文本順序的後續所有平行節點標簽

.previous_siblings叠代類型,返回按照HTML文本順序的前續所有平行節點標簽

3.2 平行遍歷的兩種方法

遍歷前序節點
for ping in soup.a.previous_sibling:
    print(ping)
for ping in soup.a.next_sibling:#遍歷後續節點
    print(ping)

四、BeautifulSoup庫的四種解析器

技術分享

從BeautifulSoup說起