最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用BeautifulSoup4解析HTML文檔的操作指南

 更新時(shí)間:2026年01月16日 09:23:29   作者:ColdAim  
本文介紹如何使用Python庫(kù)BeautifulSoup4解析HTML文檔,包括基本概念、對(duì)象類型及多種搜索方法,幫助讀者快速掌握HTML數(shù)據(jù)抓取技巧,需要的朋友可以參考下

1.BeautifulSoup4簡(jiǎn)介

1.1 BS4與lxml

開門見山!我們先來聊聊BS4是個(gè)啥,它能干啥,BS4是一個(gè)從HTML和XML文件中提取數(shù)據(jù)的python庫(kù),它可以將復(fù)雜HTML文件轉(zhuǎn)換為一個(gè)復(fù)雜的樹形結(jié)構(gòu),這棵樹的每一個(gè)結(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象都可以歸納為4類,我們?cè)诤竺鏁?huì)說

BeautifulSoup會(huì)自動(dòng)將輸入文檔轉(zhuǎn)換為Unicode編碼,將輸入文檔轉(zhuǎn)換為utf-8編碼

lxml與BS4一樣是優(yōu)秀的python解釋器,它也是,但是這二者有什么樣的區(qū)別,決定了我們?yōu)槭裁催x擇BeautifulSoup,lxml是從文檔的局部入手,只能局部遍歷,但BS4就不一樣了,它會(huì)載入整個(gè)文檔,解析整個(gè)DOM樹,正是因?yàn)檫@個(gè)工程量巨大,所以BS4會(huì)有很大的時(shí)間和空間的開銷,整體性能是低于lxml的

但是我們使用BeautifulSoup4必有其原因:BS4用來解析HTML比較簡(jiǎn)單,API設(shè)計(jì)也是非常的銀性化(人性化)方便我們使用,它也支持CSS選擇器,這對(duì)于解析整個(gè)DOM樹的BS4可謂是如虎添翼,它還支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器和lxml的XML解析器

1.2 BeautifulSoup的4類對(duì)象

我們前面說:“將復(fù)雜HTML文件轉(zhuǎn)換為一個(gè)復(fù)雜的樹形結(jié)構(gòu),這棵樹的每一個(gè)結(jié)點(diǎn)都是Python對(duì)象”,這些python可以大致分為4類:Tag、NavigableString、BeautifulSoup和Comment,我們通過幾個(gè)例子來熟悉一下這四類對(duì)象的使用方法:

  • 1.Tap 標(biāo)簽及其內(nèi)容,但默認(rèn)只拿到第一個(gè)
  • 2.NavigableString 標(biāo)簽里的內(nèi)容(字符串)
  • 3.BeautifulSoup 表示整個(gè)文檔
  • 4.Comment 是一個(gè)特殊的NavigableString類型,但輸出的內(nèi)容不包含注釋

首先第一步就是導(dǎo)包:from bs4 import BeautifulSoup;然后通過文件操作的語(yǔ)句來打開我們項(xiàng)目中的一個(gè)html文件,用一個(gè)file對(duì)象接收我們的html文件后想要讓BeautifulSoup解析它,我們還需要傳入一個(gè)解析器:html.parser

from bs4 import BeautifulSoup
import re
file = open("./Demo.html", "rb")
html = file.read().decode("utf-8")
# 通過html.parser解析器把我們的HTML解析成了一棵樹
bs = BeautifulSoup(html, "html.parser")
# 1.Tap
print("1. Tap的例子:獲取title")
print(bs.title)
# 2.NavigableString
print("2. NavigableString的例子:獲取title的string內(nèi)容和div的屬性")
print(bs.title.string)
print(bs.div.attrs)     # 獲取標(biāo)簽中的所有屬性,并返回一個(gè)字典
# 3.BeautifulSoup
print("3. BeautifulSoup的例子:獲取整個(gè)html文檔的name")
print(bs.name)
# 4.Comment
print("4. Comment的例子:獲取a的string")
print(bs.a.string)

按照以往管理咱來看看代碼!從第7行開始我們對(duì)這四類對(duì)象做了實(shí)例解釋,對(duì)應(yīng)Tap類型,我們打印了bs.title,即這個(gè)HTML文檔的

標(biāo)簽的全部信息,第12、13行我們通過bs.title.string和bs.div.attrs打印了標(biāo)簽內(nèi)的信息,title的string信息和div盒子的屬性,后面的代碼也是同樣的道理

2.文檔搜索方式

我們?cè)谕ㄟ^網(wǎng)頁(yè)的地址獲取到其源碼后不可能直接使用,所以我們?cè)讷@取HTML源碼后要先對(duì)其進(jìn)行信息的定向搜索和篩選,然后再供我們使用,對(duì)應(yīng)BeautifulSoup的文檔搜索,它提供了這樣幾種搜索方式:使用find_all()方法直接搜索、使用kwargs指定參數(shù)進(jìn)行搜索、指定字符串搜索(常與正則表達(dá)式匹配使用)和設(shè)置limit參數(shù)進(jìn)行搜索,我們依舊通過一些實(shí)際操作來掌握這些搜索方法

2.1 使用find_all()搜索

  • 字符串過濾:會(huì)查找與字符串完全匹配的內(nèi)容(注意一定是完全匹配)
  • 正則表達(dá)式搜索:使用search()方法匹配內(nèi)容,它搜索的對(duì)象依舊是一個(gè)標(biāo)簽,一個(gè)整體而不是拆分開來
t_list = bs.find_all("a")
t_list02 = bs.find_all(re.compile("a"))

對(duì)應(yīng)字符串搜索,我們往find_all()方法中傳入了一個(gè)字符串"a",進(jìn)行整個(gè)文檔的字符串過濾,只有含有單個(gè)"a"的內(nèi)容才會(huì)被篩選出來,我們使用正則表達(dá)式搜索時(shí)往find_all()方法中傳入re.compile(“a”)這樣的一個(gè)匹配規(guī)則,它會(huì)返回所有含有"a"的標(biāo)簽內(nèi)容,比如等都不例外

2.2 使用kwargs指定參數(shù)搜索

同樣是使用find_all()方法進(jìn)行文檔搜索,但是我們往其中傳入的參數(shù)完全不同,舉兩個(gè)例子,我們要搜索id="update"的標(biāo)簽、有class字樣的標(biāo)簽還有href="baidu.html"的標(biāo)簽

# 2.kwargs (參數(shù)):指定參數(shù)進(jìn)行搜索
print("-------(1)顯示id=“update“的")
t_list03 = bs.find_all(id="update")
for item in t_list03:
    print(item)
print("-------(2)只要有class就顯示出來")
t_list04 = bs.find_all(class_=True)
for item in t_list04:
    print(item)
print("-------(3)指定查找href=”baidu.html“")
t_list05 = bs.find_all(href="baidu.html" rel="external nofollow" )
for item in t_list05:
    print(item)

2.3 text參數(shù)搜索

使用text參數(shù)進(jìn)行搜索就稍顯輕松了,使用text搜索我們一般會(huì)使用列表和正則表達(dá)式搜索,這樣才能達(dá)到我們定向篩選數(shù)據(jù)的效果,話不多說上代碼

2.4 設(shè)置limit參數(shù)搜索

如果我們通過代碼bs.find_all(class_=True)來篩選出存在"class"的部分,結(jié)果是有很多很多的,但是我們?nèi)绻幌胍?個(gè)結(jié)果,需要設(shè)置參數(shù)limit=x來滿足我們的需求

t_text10 = bs.find_all("a", limit=3)
for item in t_text10:
    print(item)

2.5 CSS選擇器

相對(duì)來說通過CSS選擇器來進(jìn)行文檔搜索就很豐富了,可以通過標(biāo)簽、類名、id名、標(biāo)簽屬性和子標(biāo)簽等等方式來進(jìn)行搜索,不一樣的是我們會(huì)使用bs.select()方法來篩選

# css選擇器
print("-------(1)通過標(biāo)簽訪問")
t_css = bs.select('title')  # 通過標(biāo)簽訪問
for item in t_css:
    print(item)
print("-------(2)通過類名訪問")
t_css2 = bs.select(".col-sm-3")  # 通過類名訪問
for item in t_css2:
    print(item)
print("-------(3)通過id訪問")
t_css3 = bs.select("#btn_add")
for item in t_css3:
    print(item)
print("-------(4)通過標(biāo)簽的屬性訪問")
t_css4 = bs.select("button[type='submit']")
for item in t_css4:
    print(item)
# 注意不能有空格
print("-------(5)通過子標(biāo)簽訪問")
t_css5 = bs.select("div > button")
for item in t_css5:
    print(item)

以上就是Python使用BeautifulSoup4解析HTML文檔的操作指南的詳細(xì)內(nèi)容,更多關(guān)于Python BeautifulSoup4解析HTML的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法實(shí)例

    Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法實(shí)例

    Python中的字典是無(wú)序類型,沒有自己的排序方法,下面這篇文章主要給大家介紹了關(guān)于Python根據(jù)字典值對(duì)字典進(jìn)行排序的三種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 在漏洞利用Python代碼真的很爽

    在漏洞利用Python代碼真的很爽

    在漏洞利用Python代碼真的很爽...
    2007-08-08
  • python并發(fā)編程多進(jìn)程之守護(hù)進(jìn)程原理解析

    python并發(fā)編程多進(jìn)程之守護(hù)進(jìn)程原理解析

    這篇文章主要介紹了python并發(fā)編程多進(jìn)程之守護(hù)進(jìn)程原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Sublime如何配置Python3運(yùn)行環(huán)境

    Sublime如何配置Python3運(yùn)行環(huán)境

    這篇文章主要介紹了Sublime如何配置Python3運(yùn)行環(huán)境問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 一個(gè)Python優(yōu)雅的數(shù)據(jù)分塊方法詳解

    一個(gè)Python優(yōu)雅的數(shù)據(jù)分塊方法詳解

    在做需求過程中有一個(gè)對(duì)大量數(shù)據(jù)分塊處理的場(chǎng)景,具體來說就是幾十萬(wàn)量級(jí)的數(shù)據(jù),分批處理,每次處理100個(gè)。這時(shí)就需要一個(gè)分塊功能的代碼。本文為大家分享了一個(gè)Python中優(yōu)雅的數(shù)據(jù)分塊方法,需要的可以參考一下
    2022-05-05
  • Python爬蟲之模擬知乎登錄的方法教程

    Python爬蟲之模擬知乎登錄的方法教程

    在爬蟲過程中,有些頁(yè)面在登錄之前是被禁止抓取的,這個(gè)時(shí)候就需要模擬登陸了,下面這篇文章主要給大家介紹了利用Python爬蟲模擬知乎登錄的方法教程,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • Pygame代碼?制作一個(gè)貪吃蛇小游戲

    Pygame代碼?制作一個(gè)貪吃蛇小游戲

    這篇文章主要介紹了100行Pygame代碼?制作一個(gè)貪吃蛇小游戲,相信我們大家都玩過貪吃蛇游戲,今天我們就從頭一起來寫一個(gè)貪吃蛇小游戲,只需要100多行的代碼就完成了,需要的朋友可以參考一下
    2021-12-12
  • 基于Python的A*算法解決八數(shù)碼問題實(shí)現(xiàn)步驟

    基于Python的A*算法解決八數(shù)碼問題實(shí)現(xiàn)步驟

    這篇文章主要給大家介紹了關(guān)于如何基于Python的A*算法解決八數(shù)碼問題的實(shí)現(xiàn)步驟,文中介紹了八數(shù)碼問題及其求解方法,通過啟發(fā)式搜索算法,特別是A*算法,可以有效地解決八數(shù)碼問題,,需要的朋友可以參考下
    2024-11-11
  • python矩陣的轉(zhuǎn)置和逆轉(zhuǎn)實(shí)例

    python矩陣的轉(zhuǎn)置和逆轉(zhuǎn)實(shí)例

    今天小編就為大家分享一篇python矩陣的轉(zhuǎn)置和逆轉(zhuǎn)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python中jieba庫(kù)的使用方法

    Python中jieba庫(kù)的使用方法

    jieba庫(kù)是一款優(yōu)秀的 Python 第三方中文分詞庫(kù),本文主要介紹了Python中jieba庫(kù)的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評(píng)論

赣榆县| 通城县| 五大连池市| 额尔古纳市| 特克斯县| 马鞍山市| 浦江县| 长汀县| 北碚区| 华蓥市| 当阳市| 涟水县| 平谷区| 保定市| 营山县| 修武县| 彰武县| 禄丰县| 夹江县| 莆田市| 深州市| 陕西省| 赤水市| 祁门县| 丽江市| 云浮市| 阿瓦提县| 忻城县| 灵丘县| 阳东县| 正镶白旗| 元阳县| 满城县| 日照市| 平凉市| 商水县| 叙永县| 海安县| 新兴县| 嵩明县| 阜城县|