成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

BeautifulSoup 使用指北 - 0x03_搜索解析樹

xfee / 3513人閱讀

摘要:參考概述中定義了許多搜索解析樹的方法,但這些方法都非常類似,它們大多采用與相同的參數(shù)和,但是僅有和支持參數(shù)。本節(jié)會以作為示例過濾器過濾器用于在解析樹中篩選目標(biāo)節(jié)點(diǎn),被用作搜索方法的實(shí)參。如果函數(shù)返回,則保留該節(jié)點(diǎn),否則拋棄該節(jié)點(diǎn)。

GitHub@orca-j35,所有筆記均托管于 python_notes 倉庫。
歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處。
參考: https://www.crummy.com/softwa...
概述

BeautifulSoup 中定義了許多搜索解析樹的方法,但這些方法都非常類似,它們大多采用與 find_all() 相同的參數(shù): nameattrs、string、limit 和 **kwargs,但是僅有 find()find_all() 支持 recursive 參數(shù)。

這里著重介紹 find()find_all(),其它"搜索方法"也這兩個(gè)類似。

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)用于在解析樹中篩選目標(biāo)節(jié)點(diǎn),被用作"搜索方法"的實(shí)參。

字符串

字符串可用作過濾器,BeautifulSoup 可利用字符串來篩選節(jié)點(diǎn),并保留符合條件節(jié)點(diǎn):

使用字符串篩選 tag 時(shí),會保留與字符串同名 tag 節(jié)點(diǎn),且總會過濾掉 HTML 文本節(jié)點(diǎn)

使用字符串篩選 HTML 屬性時(shí),會保留屬性值與字符串相同的 tag 節(jié)點(diǎn),且總會過濾掉 HTML 文本節(jié)點(diǎn)

使用字符串篩選 HTML 文本時(shí),會保留與字符串相同的文本節(jié)點(diǎn)

str 字符串類似,我們還可將 bytes 對象用作過濾器,區(qū)別在于 BeautifulSoup 會假定編碼模式為 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")])

輸出:

["::b"]
["::b"]
["::a"]
["::None"]
正則表達(dá)式

正則表達(dá)式對象可用作過濾器,BeautifulSoup 會利用正則表達(dá)式對象的 search() 方法來篩選節(jié)點(diǎn),并保留符合條件節(jié)點(diǎn):

使用正則表達(dá)式對象篩選 tag 時(shí),會利用正則表達(dá)式的 search() 方法來篩選 tag 節(jié)點(diǎn)的名稱,并保留符合條件的 tag 節(jié)點(diǎn)。因?yàn)槲谋竟?jié)點(diǎn)的 .name 屬性值為 None,因此總會過濾掉 HTML 文本節(jié)點(diǎn)

使用正則表達(dá)式對象篩選 HTML 屬性時(shí),會利用正則表達(dá)式的 search() 方法來篩選指定屬性的值,并保留符合條件的 tag 節(jié)點(diǎn)。因?yàn)槲谋竟?jié)點(diǎn)不包含任何 HTML 屬性,因此總會過濾掉 HTML 文本節(jié)點(diǎn)

使用正則表達(dá)式對象篩選 HTML 文本時(shí),會利用正則表達(dá)式的 search() 方法來篩選文本節(jié)點(diǎn),并保留符合條件的文本節(jié)點(diǎn)。

示例:

import re

soup = BeautifulSoup(html_doc, "html.parser")
# 查找名稱中包含字母b的節(jié)點(diǎn)
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é)點(diǎn)
print([f"{type(i)}::{i.name}" for i in soup.find_all(text=re.compile(r"^E"))])

輸出:

["::body", "::b"]
["::p"]
["::None"]
列表

列表 list 可用作過濾器,列表中的項(xiàng)可以是:

字符串

正則表達(dá)式對象

可調(diào)用對象,詳見 函數(shù)

BeautifulSoup 會利用列表中的項(xiàng)來篩選節(jié)點(diǎn),并保留符合條件節(jié)點(diǎn):

使用列表篩選 tag 時(shí),若 tag 名與列表中的某一項(xiàng)匹配,則會保留該 tag 節(jié)點(diǎn),且總會過濾掉 HTML 文本節(jié)點(diǎn)

使用列表篩選 HTML 屬性時(shí),若屬性值與列表中的某一項(xiàng)匹配,則會保留該 tag 節(jié)點(diǎn),且總會過濾掉 HTML 文本節(jié)點(diǎn)

使用列表篩選 HTML 文本時(shí),若文本與列表中的某一項(xiàng)匹配,則會保留該文本節(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"])])

輸出:

["::title",
 "::b",
 "::a"]
["::None",
 "::None"]
True

布爾值 True 可用作過濾器:

使用 True 篩選 tag 時(shí),會保留所有 tag 節(jié)點(diǎn),且過濾掉所有 HTML 文本節(jié)點(diǎn)

使用 True 篩選 HTML 屬性時(shí),會保留所有具備該屬性的 tag 節(jié)點(diǎn),且過濾掉所有 HTML 文本節(jié)點(diǎn)

使用 True 篩選 HTML 文本時(shí),會保留所有文本節(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)])

輸出:

["::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ù)

過濾器可以是某個(gè)函數(shù)(或任何可調(diào)用對象):

以 tag 節(jié)點(diǎn)為篩選對象時(shí),過濾器函數(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"]

針對 HTML 屬性進(jìn)行篩選時(shí),過濾函數(shù)需以屬性值作為參數(shù),而非整個(gè) tag 節(jié)點(diǎn)。如果 tag 節(jié)點(diǎn)包含目標(biāo)屬性,則會向過濾函數(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

針對 HTML 文本進(jìn)行篩選時(shí),過濾需以文本值作為參數(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"]

過濾函數(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]) # 注意空白符對輸出結(jié)果的影響

輸出:

["::body",
 "::p",
 "::a",
 "::a",
 "::a",
 "::p"]
find_all()

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45280.html

相關(guān)文章

  • BeautifulSoup 使用指北 - 0x02_操作解析

    摘要:,所有筆記均托管于倉庫。中包含的字符串或等節(jié)點(diǎn)被視作該的或節(jié)點(diǎn)。為了便于在或節(jié)點(diǎn)中進(jìn)行導(dǎo)航,提供了許多與此相關(guān)的方法。節(jié)點(diǎn)名可使用節(jié)點(diǎn)名來選取目標(biāo)節(jié)點(diǎn),此時(shí)會返回子孫節(jié)點(diǎn)中的第一個(gè)同名節(jié)點(diǎn)。 GitHub@orca-j35,所有筆記均托管于 python_notes 倉庫。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處。 在解析樹中導(dǎo)航 參考: Navigating the tree 在學(xué)習(xí)與...

    高勝山 評論0 收藏0
  • BeautifulSoup 使用指北 - 0x01_概覽

    摘要:,所有筆記均托管于倉庫。是一個(gè)用來從或文件中提取數(shù)據(jù)的庫。如果對速度有嚴(yán)格要求,應(yīng)直接使用庫來解析。對而言,解析器的速度比或更快??梢酝ㄟ^安裝庫來顯著提升檢測編碼方案的速度。 GitHub@orca-j35,所有筆記均托管于 python_notes 倉庫。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處。 概述 ?官方文檔中混雜了 Py2 和 Py3 的術(shù)語和代碼,本筆記針對 Py3 梳理了文檔...

    jay_tian 評論0 收藏0
  • python爬蟲——爬取小說 | 探索白子畫和花千骨的愛恨情仇

    摘要:先打開花千骨小說的目錄頁,是這樣的。網(wǎng)頁結(jié)構(gòu)分析首先,目錄頁左上角有幾個(gè)可以提高你此次爬蟲成功后成就感的字眼暫不提供花千骨全集下載。打開盤查看花千骨文件。 知識就像碎布,記得縫一縫,你才能華麗麗地亮相。 1.Beautiful Soup 1.Beautifulsoup 簡介 此次實(shí)戰(zhàn)從網(wǎng)上爬取小說,需要使用到Beautiful Soup。Beautiful Soup為python的...

    newsning 評論0 收藏0
  • Python爬蟲之自制英漢字典

    摘要:筆者看到了,覺得還蠻有意思的,因此,決定自己也寫一個(gè)玩玩首先我們的爬蟲要能將英語單詞翻譯成中文,因此,我們就需要一個(gè)網(wǎng)站幫助我們做這件事情。 ??最近在微信公眾號中看到有人用Python做了一個(gè)爬蟲,可以將輸入的英語單詞翻譯成中文,或者把中文詞語翻譯成英語單詞。筆者看到了,覺得還蠻有意思的,因此,決定自己也寫一個(gè)玩玩~~??首先我們的爬蟲要能將英語單詞翻譯成中文,因此,我們就需要一個(gè)網(wǎng)...

    graf 評論0 收藏0
  • python爬蟲之BeautifulSoup

    摘要:爬蟲之簡介提供一些簡單的式的函數(shù)用來處理導(dǎo)航搜索修改分析樹等功能。自動將輸入文檔轉(zhuǎn)換為編碼,輸出文檔轉(zhuǎn)換為編碼。已成為和一樣出色的解釋器,為用戶靈活地提供不同的解析策略或強(qiáng)勁的速度。 python爬蟲之BeautifulSoup 簡介 **Beautiful Soup提供一些簡單的、python式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能。它是一個(gè)工具箱,通過解析文檔為用戶提供需要抓取...

    Rocko 評論0 收藏0

發(fā)表評論

0條評論

xfee

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<