日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python?頁面解析Beautiful?Soup庫的使用方法_python

作者:小嗷犬 ? 更新時間: 2022-11-03 編程語言

1.Beautiful Soup庫簡介

Beautiful Soup 簡稱 BS4(其中 4 表示版本號)是一個 Python 中常用的頁面解析庫,它可以從 HTML 或 XML 文檔中快速地提取指定的數據。

相比于之前講過的 lxml 庫,Beautiful Soup 更加簡單易用,不像正則和 XPath 需要刻意去記住很多特定語法,盡管那樣會效率更高更直接。

對大多數 Python 使用者來說,好用會比高效更重要。

Beautiful Soup庫為第三方庫,需要我們通過pip命令安裝:

pip install bs4

BS4 解析頁面時需要依賴文檔解析器,所以還需要一個文檔解析器。
Python 自帶了一個文檔解析庫 html.parser, 但是其解析速度稍慢,所以我們結合上篇內容(Python 文檔解析:lxml庫的使用),安裝 lxml 作為文檔解析庫:

pip install lxml

2.Beautiful Soup庫方法介紹

使用 bs4 的初始化操作,是用文本創建一個 BeautifulSoup 對象,并指定文檔解析器:

from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="0"><a href="www.python.org"        >Python</a></li>
        <li class="web" id="1"><a href="www.java.com"        >Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net"        >CSDN</a></li>
    </ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')
# prettify()用于格式化輸出HTML/XML文檔
print(soup.prettify())

bs4 提供了find_all()find()兩個常用的查找方法它們的用法如下:

2.1 find_all()

find_all() 方法用來搜索當前 tag 的所有子節點,并判斷這些節點是否符合過濾條件,最后以列表形式將符合條件的內容返回,語法格式如下:

find_all(name, attrs, recursive, text, limit)

參數說明:

name:查找所有名字為 name 的 tag 標簽,字符串對象會被自動忽略。attrs:按照屬性名和屬性值搜索 tag 標簽,注意由于 class 是 Python 的關鍵字,所以要使用 “class_”。recursive:find_all() 會搜索 tag 的所有子孫節點,設置 recursive=False 可以只搜索 tag 的直接子節點。text:用來搜文檔中的字符串內容,該參數可以接受字符串 、正則表達式 、列表、True。limit:由于 find_all() 會返回所有的搜索結果,這樣會影響執行效率,通過 limit 參數可以限制返回結果的數量。
from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="0"><a href="www.python.org"        >Python</a></li>
        <li class="web" id="1"><a href="www.java.com"        >Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net"        >CSDN</a></li>
    </ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')

print(soup.find_all("li"))
print(soup.find_all("a"))
print(soup.find_all(text="Python"))

上面程序使用 find_all() 方法,來查找頁面中所有的<li></li>標簽、<a></a>標簽和"Python"字符串內容。

2.2 find()

find() 方法與 find_all() 方法極其相似,不同之處在于 find() 僅返回第一個符合條件的結果,因此 find() 方法也沒有limit參數,語法格式如下:

find(name, attrs, recursive, text)

除了和 find_all() 相同的使用方式以外,bs4find() 方法提供了一種簡寫方式:

soup.find("li")
soup.li

這兩行代碼的功能相同,都是返回第一個<li></li>標簽,完整程序:

from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="0"><a href="www.python.org"        >Python</a></li>
        <li class="web" id="1"><a href="www.java.com"        >Java</a></li>
        <li class="web" id="2"><a href="www.csdn.net"        >CSDN</a></li>
    </ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')

print(soup.li)
print(soup.a)

上面的程序會打印出第一個<li></li>標簽和第一個<a></a>標簽。

2.3 select()

bs4 支持大部分的 CSS 選擇器,比如常見的標簽選擇器、類選擇器、id 選擇器,以及層級選擇器。Beautiful Soup 提供了一個 select() 方法,通過向該方法中添加選擇器,就可以在 HTML 文檔中搜索到與之對應的內容。

應用如下:

from bs4 import BeautifulSoup

html_str = '''
<div>
    <ul>
        <li class="web" id="web0"><a href="www.python.org"        >Python</a></li>
        <li class="web" id="web1"><a href="www.java.com"        >Java</a></li>
        <li class="web" id="web2"><a href="www.csdn.net"        >CSDN</a></li>
    </ul>
</div>
'''
soup = BeautifulSoup(html_str, 'lxml')
#根據元素標簽查找
print(soup.select('body'))
#根據屬性選擇器查找
print(soup.select('a[href]'))
#根據類查找
print(soup.select('.web'))
#后代節點查找
print(soup.select('div ul'))
#根據id查找
print(soup.select('#web1'))

更多方法及其詳細使用說明,請參見官方文檔:
https://beautiful-soup-4.readthedocs.io/en/latest/

3.代碼實例

學會了 Beautiful Soup ,讓我們試著改寫一下上次的爬蟲代碼吧:

import os
import sys
import requests
from bs4 import BeautifulSoup

x = requests.get('https://www.csdn.net/')

soup = BeautifulSoup(x.text, 'lxml')

img_list = soup.select('img[src]')

# 創建img文件夾
os.chdir(os.path.dirname(sys.argv[0]))

if not os.path.exists('img'):
    os.mkdir('img')
    print('創建文件夾成功')
else:
    print('文件夾已存在')

# 下載圖片
for i in range(len(img_list)):
    item = img_list[i]['src']
    img = requests.get(item).content
    if item.endswith('jpg'):
        with open(f'./img/{i}.jpg', 'wb') as f:
            f.write(img)
    elif item.endswith('jpeg'):
        with open(f'./img/{i}.jpeg', 'wb') as f:
            f.write(img)
    elif item.endswith('png'):
        with open(f'./img/{i}.png', 'wb') as f:
            f.write(img)
    else:
        print(f'第{i + 1}張圖片格式不正確')
        continue
    print(f'第{i + 1}張圖片下載成功')

這就是本文的全部內容了,快去動手試試吧!

原文鏈接:https://blog.csdn.net/qq_63585949/article/details/126762330

欄目分類
最近更新