摘要:參考概述中定義了許多搜索解析樹(shù)的方法,但這些方法都非常類(lèi)似,它們大多采用與相同的參數(shù)和,但是僅有和支持參數(shù)。本節(jié)會(huì)以作為示例過(guò)濾器過(guò)濾器用于在解析樹(shù)中篩選目標(biāo)節(jié)點(diǎn),被用作搜索方法的實(shí)參。如果函數(shù)返回,則保留該節(jié)點(diǎn),否則拋棄該節(jié)點(diǎn)。
GitHub@orca-j35,所有筆記均托管于 python_notes 倉(cāng)庫(kù)。概述
歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處。
參考: https://www.crummy.com/softwa...
BeautifulSoup 中定義了許多搜索解析樹(shù)的方法,但這些方法都非常類(lèi)似,它們大多采用與 find_all() 相同的參數(shù): name、attrs、string、limit 和 **kwargs,但是僅有 find() 和 find_all() 支持 recursive 參數(shù)。
這里著重介紹 find() 和 find_all(),其它"搜索方法"也這兩個(gè)類(lèi)似。
Three sisters本節(jié)會(huì)以 "three sister" 作為示例:
html_doc = """過(guò)濾器The Dormouse"s story The Dormouse"s story
Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.
...
""" from pprint import pprint from bs4 import BeautifulSoup import re soup = BeautifulSoup(html_doc, "html.parser")
過(guò)濾器(filter)用于在解析樹(shù)中篩選目標(biāo)節(jié)點(diǎn),被用作"搜索方法"的實(shí)參。
字符串字符串可用作過(guò)濾器,BeautifulSoup 可利用字符串來(lái)篩選節(jié)點(diǎn),并保留符合條件節(jié)點(diǎn):
使用字符串篩選 tag 時(shí),會(huì)保留與字符串同名 tag 節(jié)點(diǎn),且總會(huì)過(guò)濾掉 HTML 文本節(jié)點(diǎn)
使用字符串篩選 HTML 屬性時(shí),會(huì)保留屬性值與字符串相同的 tag 節(jié)點(diǎn),且總會(huì)過(guò)濾掉 HTML 文本節(jié)點(diǎn)
使用字符串篩選 HTML 文本時(shí),會(huì)保留與字符串相同的文本節(jié)點(diǎn)
與 str 字符串類(lèi)似,我們還可將 bytes 對(duì)象用作過(guò)濾器,區(qū)別在于 BeautifulSoup 會(huì)假定編碼模式為 UTF-8。
示例:
soup = BeautifulSoup(html_doc, "html.parser") # 查找名為b的tag節(jié)點(diǎn) print([f"{type(i)}::{i.name}" for i in soup.find_all("b")]) print([f"{type(i)}::{i.name}" for i in soup.find_all(b"b")]) # 查找id值為link1的tag節(jié)點(diǎn) print([f"{type(i)}::{i.name}" for i in soup.find_all(id="link1")]) # 查找文本值為Elsie的文本節(jié)點(diǎn) print([f"{type(i)}::{i.name}" for i in soup.find_all(text="Elsie")])
輸出:
["正則表達(dá)式::b"] [" ::b"] [" ::a"] [" ::None"]
正則表達(dá)式對(duì)象可用作過(guò)濾器,BeautifulSoup 會(huì)利用正則表達(dá)式對(duì)象的 search() 方法來(lái)篩選節(jié)點(diǎn),并保留符合條件節(jié)點(diǎn):
使用正則表達(dá)式對(duì)象篩選 tag 時(shí),會(huì)利用正則表達(dá)式的 search() 方法來(lái)篩選 tag 節(jié)點(diǎn)的名稱(chēng),并保留符合條件的 tag 節(jié)點(diǎn)。因?yàn)槲谋竟?jié)點(diǎn)的 .name 屬性值為 None,因此總會(huì)過(guò)濾掉 HTML 文本節(jié)點(diǎn)
使用正則表達(dá)式對(duì)象篩選 HTML 屬性時(shí),會(huì)利用正則表達(dá)式的 search() 方法來(lái)篩選指定屬性的值,并保留符合條件的 tag 節(jié)點(diǎn)。因?yàn)槲谋竟?jié)點(diǎn)不包含任何 HTML 屬性,因此總會(huì)過(guò)濾掉 HTML 文本節(jié)點(diǎn)
使用正則表達(dá)式對(duì)象篩選 HTML 文本時(shí),會(huì)利用正則表達(dá)式的 search() 方法來(lái)篩選文本節(jié)點(diǎn),并保留符合條件的文本節(jié)點(diǎn)。
示例:
import re soup = BeautifulSoup(html_doc, "html.parser") # 查找名稱(chēng)中包含字母b的節(jié)點(diǎn) print([f"{type(i)}::{i.name}" for i in soup.find_all(re.compile(r"b"))]) # 查找class值以t開(kāi)頭的tag print( [f"{type(i)}::{i.name}" for i in soup.find_all(class_=re.compile(r"^t"))]) # 查找文本值以E開(kāi)頭的文本節(jié)點(diǎn) print([f"{type(i)}::{i.name}" for i in soup.find_all(text=re.compile(r"^E"))])
輸出:
["列表::body", " ::b"] [" ::p"] [" ::None"]
列表 list 可用作過(guò)濾器,列表中的項(xiàng)可以是:
字符串
正則表達(dá)式對(duì)象
可調(diào)用對(duì)象,詳見(jiàn) 函數(shù)
BeautifulSoup 會(huì)利用列表中的項(xiàng)來(lái)篩選節(jié)點(diǎn),并保留符合條件節(jié)點(diǎn):
使用列表篩選 tag 時(shí),若 tag 名與列表中的某一項(xiàng)匹配,則會(huì)保留該 tag 節(jié)點(diǎn),且總會(huì)過(guò)濾掉 HTML 文本節(jié)點(diǎn)
使用列表篩選 HTML 屬性時(shí),若屬性值與列表中的某一項(xiàng)匹配,則會(huì)保留該 tag 節(jié)點(diǎn),且總會(huì)過(guò)濾掉 HTML 文本節(jié)點(diǎn)
使用列表篩選 HTML 文本時(shí),若文本與列表中的某一項(xiàng)匹配,則會(huì)保留該文本節(jié)點(diǎn)
示例
import re def func(tag): return tag.get("id") == "link1" soup = BeautifulSoup(html_doc, "html.parser") # 查找與列表匹配的tag節(jié)點(diǎn) tag = soup.find_all(["title", re.compile("b$"), func]) pprint([f"{type(i)}::{i.name}" for i in tag]) pprint( [f"{type(i)}::{i.name}" for i in soup.find_all(text=["Elsie", "Tillie"])])
輸出:
["True::title", " ::b", " ::a"] [" ::None", " ::None"]
布爾值 True 可用作過(guò)濾器:
使用 True 篩選 tag 時(shí),會(huì)保留所有 tag 節(jié)點(diǎn),且過(guò)濾掉所有 HTML 文本節(jié)點(diǎn)
使用 True 篩選 HTML 屬性時(shí),會(huì)保留所有具備該屬性的 tag 節(jié)點(diǎn),且過(guò)濾掉所有 HTML 文本節(jié)點(diǎn)
使用 True 篩選 HTML 文本時(shí),會(huì)保留所有文本節(jié)點(diǎn)
soup = BeautifulSoup(html_doc, "html.parser") pprint([f"{type(i)}::{i.name}" for i in soup.find_all(True)]) pprint([f"{type(i)}::{i.name}" for i in soup.find_all(id=True)]) pprint([f"{type(i)}::{i.name}" for i in soup.find_all(text=True)])
輸出:
["函數(shù)::html", " ::head", " ::title", " ::body", " ::p", " ::b", " ::p", " ::a", " ::a", " ::a", " ::p"] [" ::a", " ::a", " ::a"] [" ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None", " ::None"]
過(guò)濾器可以是某個(gè)函數(shù)(或任何可調(diào)用對(duì)象):
以 tag 節(jié)點(diǎn)為篩選對(duì)象時(shí),過(guò)濾器函數(shù)需以 tag 節(jié)點(diǎn)作為參數(shù),如果函數(shù)返回 True,則保留該 tag 節(jié)點(diǎn),否則拋棄該節(jié)點(diǎn)。
示例 - 篩選出含 class 屬性,但不含 id 屬性的 tag 節(jié)點(diǎn):
def has_class_but_no_id(tag): # Here’s a function that returns True if a tag defines the “class” attribute but doesn’t define the “id” attribute return tag.has_attr("class") and not tag.has_attr("id") soup = BeautifulSoup(html_doc, "html.parser") tag = soup.find_all(has_class_but_no_id) pprint([f"{type(i)}::{i.name}" for i in tag])
輸出:
["::p", " ::p", " ::p"]
針對(duì) HTML 屬性進(jìn)行篩選時(shí),過(guò)濾函數(shù)需以屬性值作為參數(shù),而非整個(gè) tag 節(jié)點(diǎn)。如果 tag 節(jié)點(diǎn)包含目標(biāo)屬性,則會(huì)向過(guò)濾函數(shù)傳遞 None,否則傳遞實(shí)際值。如果函數(shù)返回 True,則保留該 tag 節(jié)點(diǎn),否則拋棄該節(jié)點(diǎn)。
def not_lacie(href): # Here’s a function that finds all a tags whose href attribute does not match a regular expression return href and not re.compile("lacie").search(href) soup = BeautifulSoup(html_doc, "html.parser") tag = soup.find_all(href=not_lacie) for i in tag: print(f"{type(i)}::{i.name}::{i}")
輸出:
::a::Elsie ::a::Tillie
針對(duì) HTML 文本進(jìn)行篩選時(shí),過(guò)濾需以文本值作為參數(shù),而非整個(gè) tag 節(jié)點(diǎn)。如果函數(shù)返回 True,則保留該 tag 節(jié)點(diǎn),否則拋棄該節(jié)點(diǎn)。
def func(text): return text == "Lacie" soup = BeautifulSoup(html_doc, "html.parser") print([f"{type(i)}::{i}" for i in soup.find_all(text=func)])
輸出:
["::Lacie"]
過(guò)濾函數(shù)可以被設(shè)計(jì)的非常復(fù)雜,比如:
html_doc = """The Dormouse"s story The Dormouse"s story
Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.
...
""" def surrounded_by_strings(tag): # returns True if a tag is surrounded by string objects return (isinstance(tag.next_element, NavigableString) and isinstance(tag.previous_element, NavigableString)) soup = BeautifulSoup(html_doc, "html.parser") tag = soup.find_all(surrounded_by_strings) pprint([f"{type(i)}::{i.name}" for i in tag]) # 注意空白符對(duì)輸出結(jié)果的影響
輸出:
["find_all()::body", " ::p", " ::a", " ::a", " ::a", " ::p"]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/45280.html
摘要:,所有筆記均托管于倉(cāng)庫(kù)。中包含的字符串或等節(jié)點(diǎn)被視作該的或節(jié)點(diǎn)。為了便于在或節(jié)點(diǎn)中進(jìn)行導(dǎo)航,提供了許多與此相關(guān)的方法。節(jié)點(diǎn)名可使用節(jié)點(diǎn)名來(lái)選取目標(biāo)節(jié)點(diǎn),此時(shí)會(huì)返回子孫節(jié)點(diǎn)中的第一個(gè)同名節(jié)點(diǎn)。 GitHub@orca-j35,所有筆記均托管于 python_notes 倉(cāng)庫(kù)。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處。 在解析樹(shù)中導(dǎo)航 參考: Navigating the tree 在學(xué)習(xí)與...
摘要:,所有筆記均托管于倉(cāng)庫(kù)。是一個(gè)用來(lái)從或文件中提取數(shù)據(jù)的庫(kù)。如果對(duì)速度有嚴(yán)格要求,應(yīng)直接使用庫(kù)來(lái)解析。對(duì)而言,解析器的速度比或更快。可以通過(guò)安裝庫(kù)來(lái)顯著提升檢測(cè)編碼方案的速度。 GitHub@orca-j35,所有筆記均托管于 python_notes 倉(cāng)庫(kù)。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處。 概述 ?官方文檔中混雜了 Py2 和 Py3 的術(shù)語(yǔ)和代碼,本筆記針對(duì) Py3 梳理了文檔...
摘要:先打開(kāi)花千骨小說(shuō)的目錄頁(yè),是這樣的。網(wǎng)頁(yè)結(jié)構(gòu)分析首先,目錄頁(yè)左上角有幾個(gè)可以提高你此次爬蟲(chóng)成功后成就感的字眼暫不提供花千骨全集下載。打開(kāi)盤(pán)查看花千骨文件。 知識(shí)就像碎布,記得縫一縫,你才能華麗麗地亮相。 1.Beautiful Soup 1.Beautifulsoup 簡(jiǎn)介 此次實(shí)戰(zhàn)從網(wǎng)上爬取小說(shuō),需要使用到Beautiful Soup。Beautiful Soup為python的...
摘要:筆者看到了,覺(jué)得還蠻有意思的,因此,決定自己也寫(xiě)一個(gè)玩玩首先我們的爬蟲(chóng)要能將英語(yǔ)單詞翻譯成中文,因此,我們就需要一個(gè)網(wǎng)站幫助我們做這件事情。 ??最近在微信公眾號(hào)中看到有人用Python做了一個(gè)爬蟲(chóng),可以將輸入的英語(yǔ)單詞翻譯成中文,或者把中文詞語(yǔ)翻譯成英語(yǔ)單詞。筆者看到了,覺(jué)得還蠻有意思的,因此,決定自己也寫(xiě)一個(gè)玩玩~~??首先我們的爬蟲(chóng)要能將英語(yǔ)單詞翻譯成中文,因此,我們就需要一個(gè)網(wǎng)...
摘要:爬蟲(chóng)之簡(jiǎn)介提供一些簡(jiǎn)單的式的函數(shù)用來(lái)處理導(dǎo)航搜索修改分析樹(shù)等功能。自動(dòng)將輸入文檔轉(zhuǎn)換為編碼,輸出文檔轉(zhuǎn)換為編碼。已成為和一樣出色的解釋器,為用戶(hù)靈活地提供不同的解析策略或強(qiáng)勁的速度。 python爬蟲(chóng)之BeautifulSoup 簡(jiǎn)介 **Beautiful Soup提供一些簡(jiǎn)單的、python式的函數(shù)用來(lái)處理導(dǎo)航、搜索、修改分析樹(shù)等功能。它是一個(gè)工具箱,通過(guò)解析文檔為用戶(hù)提供需要抓取...
閱讀 4091·2021-11-22 09:34
閱讀 1568·2021-11-04 16:10
閱讀 1795·2021-10-11 10:59
閱讀 3333·2019-08-30 15:44
閱讀 2104·2019-08-30 13:17
閱讀 3536·2019-08-30 11:05
閱讀 802·2019-08-29 14:02
閱讀 2672·2019-08-26 13:34