1. 程式人生 > >Python3爬蟲學習筆記(4.BeautifulSoup庫詳解)

Python3爬蟲學習筆記(4.BeautifulSoup庫詳解)

這是一個功能強大的庫,可以代替很多需要寫正則的地方

這是一個第三方解析庫,常規安裝方法:

調出cmd:pip install bs4

簡單瞭解:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>TITLE</title>
</head>
<body>
<table border="1">
    <tr>/
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
<td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') #自動補全修正html文字 print(soup.prettify()) #獲得html的標題 print(soup.title.string)

標籤選擇器:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
<title>TITLE</title> </head> <body> <table border="1"> <tr>/ <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html
, 'lxml') print(soup.title) #<title>TITLE</title> print(soup.head) ''' <head> <meta charset="utf-8"/> <title>TITLE</title> </head> ''' print(soup.td) #只能獲取第一個,所以列印:<td>第一行,第1列</td>

獲取屬性:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>/
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.table["border"])
#1

獲取內容:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.table.tr.td.string)
#第一行,第1列

子節點:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.table.tr.contents)
#['\n', <td>第一行,第1列</td>, '\n', <td>第一行,第2列</td>, '\n', <td>第一行,第3列</td>, '\n']
另外一種:
html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for i, child in enumerate(soup.table.tr.children):
    print(i, child)
'''
0
1 <td>第一行,第1列</td>
2
3 <td>第一行,第2列</td>
4
5 <td>第一行,第3列</td>
6
可以看出.children實際上是一個迭代器。
'''

子孫節點:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for i, child in enumerate(soup.table.descendants):
    print(i, child)
'''
0
1 <tr>
<td>第一行,第1列</td>
<td>第一行,第2列</td>
<td>第一行,第3列</td>
</tr>
2
3 <td>第一行,第1列</td>
4 第一行,第1列
5
6 <td>第一行,第2列</td>
7 第一行,第2列
8
9 <td>第一行,第3列</td>
10 第一行,第3列
11
12
'''

父節點:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.tr.parent)
'''
<table border="1">
<tr>
<td>第一行,第1列</td>
<td>第一行,第2列</td>
<td>第一行,第3列</td>
</tr>
</table>
'''

兄弟節點:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(list(enumerate(soup.td.next_siblings)))
#[(0, '\n'), (1, <td>第一行,第2列</td>), (2, '\n'), (3, <td>第一行,第3列</td>), (4, '\n')]
print(list(enumerate(soup.td.previous_siblings)))
#[(0, '\n')]

標準選擇器(實用):

find_all詳解:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td id="1">第一行,第1列</td>
        <td class="c1">第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all("td"))
#[<td>第一行,第1列</td>, <td>第一行,第2列</td>, <td>第一行,第3列</td>]
#可以遍歷輸出,這裡不寫了(td標籤裡面的內容是後邊臨時加的)
print(soup.find_all(attrs={"id": "1"}))
#[<td id="1">第一行,第1列</td>](臨時加的id)
print(soup.find_all(id="1"))
#[<td id="1">第一行,第1列</td>]
print(soup.find_all(class_="c1"))
#[<td class="c1">第一行,第2列</td>](臨時加的class)
#注意這裡要加上下劃線
print(soup.find_all(text="第一行,第3列"))
#['第一行,第3列']

find方法類似,只不過是把find_all方法獲取的列表裡面的第一個元素拿出來了,這裡就不仔細寫了。

CSS選擇器:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table class="c0" border="1">
    <tr id="0">
        <td id="1">第一行,第1列</td>
        <td id="2" class="c1">第一行,第2列</td>
        <td id="3">第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select("tr td"))
#[<td id="1">第一行,第1列</td>, <td class="c1">第一行,第2列</td>, <td>第一行,第3列</td>]
print(soup.select(".c0 .c1"))
#[<td class="c1">第一行,第2列</td>]
print(soup.select("#0 .c1"))
#[<td class="c1">第一行,第2列</td>]
for td in soup.select("td"):
    print(td["id"])
#臨時加入的三個id,會遍歷輸出1,2,3
for td in soup.select("td"):
    print(td.get_text())
"""
第一行,第1列
第一行,第2列
第一行,第3列
"""

相關推薦

Python3爬蟲學習筆記4.BeautifulSoup

這是一個功能強大的庫,可以代替很多需要寫正則的地方 這是一個第三方解析庫,常規安裝方法: 調出cmd:pip install bs4 簡單瞭解: html = """ <html lang=

Python3爬蟲學習筆記1.urllib

1.什麼是爬蟲:略,到處都有講解。 雖然是入門,不過沒有Python基礎的同學看起來可能費勁,建議稍學下Python 之前學習前端知識也是為了能看懂HTML,便於爬蟲學習,建議瞭解下前端知識 2.re

Python3爬蟲學習筆記2.Requests)

Requests庫功能相比Urllib庫更強大,也許是自帶的 如果沒有,cmd輸入pip install requests獲取即可 例項: import requests response = r

python爬蟲學習筆記二:Requests及HTTP協議

Requests庫的安裝:https://mp.csdn.net/postedit/83715574 r=requests.get(url,params=None,**kwargs) 這個r是Response物件 url :擬獲取頁面的url連結 params:url中的額外引數

python爬蟲學習筆記四:BeautifulSoup對HTML文字進行操作

只要你提供的資訊是標籤,就可以很好的解析 怎麼使用BeautifulSoup庫? from bs4 import BeautifulSoup soup=BeautifulSoup('<p>data<p>','html.parser') 例如: import

Python3 爬蟲學習筆記】部署相關的安裝

如果想要大規模抓取資料,那麼一定會用到分散式爬蟲。對於分散式爬蟲來說,我們需要多臺主機,每臺主機有多個爬蟲任務,但是原始碼其實只有一份。 對於Scrapy來說,它有一個擴充套件元件,叫作Scrapyd,我們只需要安裝該擴充套件元件,即可遠端管理Scrapy任務

python3爬蟲學習筆記初入爬蟲 urllib學習

一、爬蟲是什麼 網路爬蟲(也叫做網頁蜘蛛),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。如果把網際網路比做成一個大的蜘蛛網,蜘蛛網上每個節點都有大量的資料,爬蟲就像一隻小蜘蛛通過網頁的地址找到網站並獲取資訊:HTML程式碼/JSON資料/二進位制資料(圖

python3語言學習筆記六:模組+輸入輸出

引入模組 import 模組名     使用時:模組名.函式名(引數) from 模組名 import 函式名 使用時:函式名(引數) import 模組名.* 使用時:函式名(引數) 格式化字串 方式一:使用str.format() 方式二:使用%格式化字串

Python基礎學習資料語法、函式

目錄 目錄 1 常用函式 5 input() 5 int() 6 len() 7 list() 與tuple相對 8 tuple() 與list相對 9 sum() 10 max() 11 min() 12 print() 13 range() 14 set() 15 sorted() 16

Python3 爬蟲學習筆記】基本的使用 11—— 正則表示式 4

4. findall() search()方法可以返回匹配正則表示式的第一個內容,但是如果想要獲取匹配正則表示式的所有內容,就要藉助findall()方法了。該方法會搜尋整個字串,然後返回匹配正則表示式的所有內容。 上一節中的HTML文字中,如果想要獲得所有a節點的超連結、歌手和歌名,就

Python3 爬蟲學習筆記】解析的使用 4 —— Beautiful Soup 2

父節點和祖先節點 如果要獲取某個節點元素的父節點,可以呼叫parent屬性: html = """ <html> <head> <title>The Dormouse's story</title> </head> <

Python3 爬蟲學習筆記】解析的使用 11 —— 使用pyquery 4

偽類選擇器 CSS選擇器之所以強大,還有一個很重要的原因,那就是它支援多種多樣的偽類選擇器,例如選擇第一個節點、最後一個節點、奇偶數節點、包含某一文字的節點等。示例如下: html = ''' <div class="wrap"> <div id="containe

Python3 爬蟲學習筆記】解析的使用 6 —— Beautiful Soup 4

text text引數可用來匹配節點的文字,傳入的形式可以是字串,可以是正則表示式,可以是正則表示式物件,示例如下: import re html = ''' <div class="panel"> <div class="panel-body

Python爬蟲學習筆記——urllib的使用

scheme param https ade 網站 dmgr nor 分享圖片 out 前言 我買了崔慶才的《Python3網絡爬蟲開發實戰》,趁著短學期,準備系統地學習下網絡爬蟲。在學習這本書的同時,通過博客摘錄並總結知識點,同時也督促自己每日學習。本書第一章是開發環境的

Python爬蟲學習筆記——requests的使用

pip 安裝 .text rep 瀏覽器 ror clas ade 學習筆記 準備工作 requests庫不是python自帶的庫,可以用pip安裝。在使用時導入requests即可。 基本用法 GET請求 r = requests.get(url) print(r.tex

Python3 爬蟲學習筆記】基本的使用 8—— 正則表示式 1

三、正則表示式 1.例項引入 開啟開源中國提供的正則表示式測試工具 http://tool.oschina.net/regex/ ,輸入待匹配的文字,然後選擇常用的正則表示式,就可以得出相應的匹配結果。 對於URL來說,可以用下面的正則表示式匹配: [a-zA-z]+://[^\

Python3 爬蟲學習筆記】基本的使用 7 —— 使用requests

抓取二進位制資料 前面我們抓取知乎的一個頁面,實際上它返回的是一個HTML文件。如何抓取圖片、音訊、視訊? 圖片、音訊、視訊這些檔案本質上都是由二進位制碼組成的,由於有特定的儲存格式和對應的解析方式,我們才可以看到這些形形色色的多媒體,所以要抓取它們,就要拿到它們的二進位制碼。 抓取

Python3 爬蟲學習筆記】基本的使用 12—— 正則表示式 5

6. compile() compile()方法可以將正則字串編譯成正則表示式物件,以便在後面的匹配中複用。示例程式碼如下: import re content1 = '2016-12-15 12:00' content2 = '2016-12-17 12:55' content3

Python3 爬蟲學習筆記】基本的使用 10—— 正則表示式 3

3.search() mathch()方法是從字串的開頭開始匹配的,一旦開頭不匹配,那麼整個匹配就失敗了。因為match()方法在使用時需要考慮到開頭的內容,這在匹配時並不方便。它更適合用來檢測某個字串是否符合某個正則表示式的規則。 search()方法在匹配時會掃描整個字串,然後返回第

Python3 爬蟲學習筆記】基本的使用 9—— 正則表示式 2

1.1 匹配目標 如果想從字串中提取出一部分內容,可以用()括號將想提取的子字串括起來。()實際上標記了一個子表示式的開始和結束位置,被標記的每個子表示式會一次對應一個分組,呼叫group()方法傳入分組的索引即可獲取提取的結果。示例如下: import re content =