摘要:參考概述中定義了許多搜索解析樹的方法,但這些方法都非常類似,它們大多采用與相同的參數和,但是僅有和支持參數。本節會以作為示例過濾器過濾器用于在解析樹中篩選目標節點,被用作搜索方法的實參。如果函數返回,則保留該節點,否則拋棄該節點。
GitHub@orca-j35,所有筆記均托管于 python_notes 倉庫。概述
歡迎任何形式的轉載,但請務必注明出處。
參考: https://www.crummy.com/softwa...
BeautifulSoup 中定義了許多搜索解析樹的方法,但這些方法都非常類似,它們大多采用與 find_all() 相同的參數: name、attrs、string、limit 和 **kwargs,但是僅有 find() 和 find_all() 支持 recursive 參數。
這里著重介紹 find() 和 find_all(),其它"搜索方法"也這兩個類似。
Three sisters本節會以 "three sister" 作為示例:
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.
...
""" from pprint import pprint from bs4 import BeautifulSoup import re soup = BeautifulSoup(html_doc, "html.parser")
過濾器(filter)用于在解析樹中篩選目標節點,被用作"搜索方法"的實參。
字符串字符串可用作過濾器,BeautifulSoup 可利用字符串來篩選節點,并保留符合條件節點:
使用字符串篩選 tag 時,會保留與字符串同名 tag 節點,且總會過濾掉 HTML 文本節點
使用字符串篩選 HTML 屬性時,會保留屬性值與字符串相同的 tag 節點,且總會過濾掉 HTML 文本節點
使用字符串篩選 HTML 文本時,會保留與字符串相同的文本節點
與 str 字符串類似,我們還可將 bytes 對象用作過濾器,區別在于 BeautifulSoup 會假定編碼模式為 UTF-8。
示例:
soup = BeautifulSoup(html_doc, "html.parser") # 查找名為b的tag節點 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節點 print([f"{type(i)}::{i.name}" for i in soup.find_all(id="link1")]) # 查找文本值為Elsie的文本節點 print([f"{type(i)}::{i.name}" for i in soup.find_all(text="Elsie")])
輸出:
["正則表達式::b"] [" ::b"] [" ::a"] [" ::None"]
正則表達式對象可用作過濾器,BeautifulSoup 會利用正則表達式對象的 search() 方法來篩選節點,并保留符合條件節點:
使用正則表達式對象篩選 tag 時,會利用正則表達式的 search() 方法來篩選 tag 節點的名稱,并保留符合條件的 tag 節點。因為文本節點的 .name 屬性值為 None,因此總會過濾掉 HTML 文本節點
使用正則表達式對象篩選 HTML 屬性時,會利用正則表達式的 search() 方法來篩選指定屬性的值,并保留符合條件的 tag 節點。因為文本節點不包含任何 HTML 屬性,因此總會過濾掉 HTML 文本節點
使用正則表達式對象篩選 HTML 文本時,會利用正則表達式的 search() 方法來篩選文本節點,并保留符合條件的文本節點。
示例:
import re soup = BeautifulSoup(html_doc, "html.parser") # 查找名稱中包含字母b的節點 print([f"{type(i)}::{i.name}" for i in soup.find_all(re.compile(r"b"))]) # 查找class值以t開頭的tag print( [f"{type(i)}::{i.name}" for i in soup.find_all(class_=re.compile(r"^t"))]) # 查找文本值以E開頭的文本節點 print([f"{type(i)}::{i.name}" for i in soup.find_all(text=re.compile(r"^E"))])
輸出:
["列表::body", " ::b"] [" ::p"] [" ::None"]
列表 list 可用作過濾器,列表中的項可以是:
字符串
正則表達式對象
可調用對象,詳見 函數
BeautifulSoup 會利用列表中的項來篩選節點,并保留符合條件節點:
使用列表篩選 tag 時,若 tag 名與列表中的某一項匹配,則會保留該 tag 節點,且總會過濾掉 HTML 文本節點
使用列表篩選 HTML 屬性時,若屬性值與列表中的某一項匹配,則會保留該 tag 節點,且總會過濾掉 HTML 文本節點
使用列表篩選 HTML 文本時,若文本與列表中的某一項匹配,則會保留該文本節點
示例
import re def func(tag): return tag.get("id") == "link1" soup = BeautifulSoup(html_doc, "html.parser") # 查找與列表匹配的tag節點 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 可用作過濾器:
使用 True 篩選 tag 時,會保留所有 tag 節點,且過濾掉所有 HTML 文本節點
使用 True 篩選 HTML 屬性時,會保留所有具備該屬性的 tag 節點,且過濾掉所有 HTML 文本節點
使用 True 篩選 HTML 文本時,會保留所有文本節點
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)])
輸出:
["函數::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"]
過濾器可以是某個函數(或任何可調用對象):
以 tag 節點為篩選對象時,過濾器函數需以 tag 節點作為參數,如果函數返回 True,則保留該 tag 節點,否則拋棄該節點。
示例 - 篩選出含 class 屬性,但不含 id 屬性的 tag 節點:
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"]
針對 HTML 屬性進行篩選時,過濾函數需以屬性值作為參數,而非整個 tag 節點。如果 tag 節點包含目標屬性,則會向過濾函數傳遞 None,否則傳遞實際值。如果函數返回 True,則保留該 tag 節點,否則拋棄該節點。
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
針對 HTML 文本進行篩選時,過濾需以文本值作為參數,而非整個 tag 節點。如果函數返回 True,則保留該 tag 節點,否則拋棄該節點。
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"]
過濾函數可以被設計的非常復雜,比如:
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]) # 注意空白符對輸出結果的影響
輸出:
["find_all()::body", " ::p", " ::a", " ::a", " ::a", " ::p"]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/45280.html
摘要:,所有筆記均托管于倉庫。中包含的字符串或等節點被視作該的或節點。為了便于在或節點中進行導航,提供了許多與此相關的方法。節點名可使用節點名來選取目標節點,此時會返回子孫節點中的第一個同名節點。 GitHub@orca-j35,所有筆記均托管于 python_notes 倉庫。歡迎任何形式的轉載,但請務必注明出處。 在解析樹中導航 參考: Navigating the tree 在學習與...
摘要:,所有筆記均托管于倉庫。是一個用來從或文件中提取數據的庫。如果對速度有嚴格要求,應直接使用庫來解析。對而言,解析器的速度比或更快。可以通過安裝庫來顯著提升檢測編碼方案的速度。 GitHub@orca-j35,所有筆記均托管于 python_notes 倉庫。歡迎任何形式的轉載,但請務必注明出處。 概述 ?官方文檔中混雜了 Py2 和 Py3 的術語和代碼,本筆記針對 Py3 梳理了文檔...
摘要:先打開花千骨小說的目錄頁,是這樣的。網頁結構分析首先,目錄頁左上角有幾個可以提高你此次爬蟲成功后成就感的字眼暫不提供花千骨全集下載。打開盤查看花千骨文件。 知識就像碎布,記得縫一縫,你才能華麗麗地亮相。 1.Beautiful Soup 1.Beautifulsoup 簡介 此次實戰從網上爬取小說,需要使用到Beautiful Soup。Beautiful Soup為python的...
摘要:筆者看到了,覺得還蠻有意思的,因此,決定自己也寫一個玩玩首先我們的爬蟲要能將英語單詞翻譯成中文,因此,我們就需要一個網站幫助我們做這件事情。 ??最近在微信公眾號中看到有人用Python做了一個爬蟲,可以將輸入的英語單詞翻譯成中文,或者把中文詞語翻譯成英語單詞。筆者看到了,覺得還蠻有意思的,因此,決定自己也寫一個玩玩~~??首先我們的爬蟲要能將英語單詞翻譯成中文,因此,我們就需要一個網...
摘要:爬蟲之簡介提供一些簡單的式的函數用來處理導航搜索修改分析樹等功能。自動將輸入文檔轉換為編碼,輸出文檔轉換為編碼。已成為和一樣出色的解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。 python爬蟲之BeautifulSoup 簡介 **Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取...
閱讀 3927·2021-11-22 09:34
閱讀 1501·2021-11-04 16:10
閱讀 1733·2021-10-11 10:59
閱讀 3281·2019-08-30 15:44
閱讀 2045·2019-08-30 13:17
閱讀 3455·2019-08-30 11:05
閱讀 752·2019-08-29 14:02
閱讀 2627·2019-08-26 13:34