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