【Python】使用匿名函數Lambda解析html源碼的任意元素(Seleinium ,BeautifulSoup皆適用)

一直都發現lambda函數非常好用,它可以用簡潔的方式編寫小函數,無需寫冗長的過程就可以獲取結果。干脆利落!

它允許我們定義一個匿名函數,在調用一次性的函數時非常有用。

最近整理了一些,lambda函數結合BeautifulSoup或者selenium 的庫,來解析HTML,并提取任意標簽下的元素的方法。

先定義一個html源碼:

from bs4 import BeautifulSoup# 假設這是你的HTML源碼
html_doc = """
<html>
<head><title>The Dormouse's story</title>
</head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
</body>
</html>
"""# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_doc, 'html.parser')

1. 提取節點下,任意含有href的內容

如果我們想要提取某個div節點下的所有 href 內容,而在不確定標簽值,例如spanpa 標簽的時候,我們可以提取每個標簽的href屬性值,以獲取所有的鏈接url

這里,我們就可以用lambda的方法:

comments = soup.find_all(lambda tag:tag.has_attr('href')) 
'''對子元素下的任意href進行提取 '''
for i in range(len(comments)):        link=comments[i].attrs['href']

在這段代碼中, lambda tag:tag.has_attr('href') 構建了一個lambda匿名函數,

用于定義find_all的搜索條件。

在這個lambda函數中,tag是傳遞給函數的參數,代表文檔中的一個標簽。

tag.has_attr('href') 則負責檢查,傳入的tag是否有一個名為href的屬性。

href是一個常見的HTML屬性,用于指定超鏈接的目標URL。

上面的寫法用于查找所有包含href屬性的標簽(通常是<a>標簽,即超鏈接)。
在這里插入圖片描述

這個方法提取下,就不用在意是a 標簽還是別的什么標簽了,

直接查找所有具有href屬性的標簽,并返回一個包含這些標簽的列表。

這個方法可以直接可以打包成一個通用的方法,以后直接獲取href的時候可以直接調用!

2. 獲取網頁源碼下,包含所有含p標簽的列表

有時候,我們可能需要做到處理一整個節點下,含有某個節點的所有內容,例如下面的br節點:
在這里插入圖片描述
上面的源碼看起來還是很規則的,如果還要再復雜一點,而你又想獲取所有br的內容的話,可以這樣:

find_tag = lambda tag_name: soup.find_all(tag_name)

使用lambda函數提取所有的<br>標簽

br_tags = find_tag('br')

如果是p標簽,那么就是:

p_tags = find_tag('p')

完整代碼:


# 定義一個lambda函數來查找任意標簽
find_tag = lambda tag_name: soup.find_all(tag_name)# 使用lambda函數提取所有的<p>標簽
p_tags = find_tag('p')# 使用lambda函數提取所有的<a>標簽
a_tags = find_tag('a')# 打印結果
for tag in p_tags:print(tag)for tag in a_tags:print(tag)

在這個示例中,find_tag是一個lambda函數,它接受一個參數tag_name(你想要查找的標簽名),并返回一個包含所有該標簽的列表。

然后你可以使用這個函數來查找任何你想要的標簽。

這種方法的好處是代碼簡潔,并且可以輕松地重用于不同的標簽。你只需要改變傳遞給lambda函數的參數即可。

3.提取任意節點下的文字

如果你想用selenium操作上面類似的操作,也同樣可以!

在Python中,使用Selenium的find_elements方法,來提取任意標簽下的所有文本。

你可以按照以下步驟操作:

  1. 導入Selenium的WebDriver和By模塊。
  2. 創建WebDriver實例。
  3. 打開目標網頁。
  4. 使用find_elements方法和適當的By類來查找所有你想要的標簽。
  5. 遍歷找到的元素列表,使用text屬性來獲取每個元素的文本。
  6. 打印或處理這些文本。
  7. 關閉瀏覽器。

下面是一個具體的代碼示例:

from selenium import webdriver
from selenium.webdriver.common.by import By# 創建WebDriver實例,這里以Chrome為例
driver = webdriver.Chrome()# 打開目標網頁
driver.get("你的目標網頁URL")# 使用find_elements方法提取任意標簽下的所有元素,例如提取所有的<p>標簽
elements = driver.find_elements(By.TAG_NAME, 'p')# 遍歷所有找到的<p>標簽,并打印它們的文本
for element in elements:print(element.text)# 關閉瀏覽器
driver.quit()

在這個例子中,find_elements(By.TAG_NAME, 'p')會找到頁面上所有的<p>標簽,并將它們作為一個元素列表返回。

然后,通過遍歷這個列表,你可以使用.text屬性來獲取每個<p>標簽的文本內容。

如果你想要提取其他標簽的文本,只需將'p'替換為你想要的標簽名即可。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64266.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64266.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Bash語言的語法

Bash語言簡介與應用 Bash&#xff08;Bourne Again SHell&#xff09;是一種Unix Shell和命令語言&#xff0c;在Linux、macOS及其他類Unix系統中被廣泛使用。作為GNU項目的一部分&#xff0c;Bash不僅是對早期Bourne Shell的增強&#xff0c;還引入了許多特性和功能&#xff…

Ingress-Nginx Annotations 指南:配置要點全方面解讀(下)

文章目錄 1.HTTP2 Push Preload2.Server Alias3.Server snippet4.Client Body Buffer Size5.External Authentication6.Global External Authentication7.Rate Limiting8.Global Rate Limiting9.Permanent Redirect10.Permanent Redirect Code11.Temporal Redirect12.SSL Passt…

互聯網路由架構

大家覺得有意義和幫助記得及時關注和點贊!!! 本書致力于解決實際問題&#xff0c;書中包含大量的架構圖、拓撲圖和真實場景示例&#xff0c;內容全面 且易于上手&#xff0c;是不可多得的良心之作。本書目的是使讀者成為將自有網絡集成到全球互聯網 領域的專家。 以下是筆記內…

【Flutter_Web】Flutter編譯Web第三篇(網絡請求篇):dio如何改造方法,變成web之后數據如何處理

前言 Flutter端在處理網絡請求的時候&#xff0c;最常用的庫當然是Dio了&#xff0c;那么在改造成web端的時候&#xff0c;最先處理的必然是網絡請求&#xff0c;否則沒有數據去處理驅動實圖渲染。 官方鏈接 pub https://pub.dev/packages/diogithub https://github.com/c…

Spring Boot @Conditional注解

在Spring Boot中&#xff0c;Conditional 注解用于條件性地注冊bean。這意味著它可以根據某些條件來決定是否應該創建一個特定的bean。這個注解可以放在配置類或方法上&#xff0c;并且它會根據提供的一組條件來判斷是否應該實例化對應的組件。 要使用 Conditional注解時&#…

項目上傳到gitcode

首先需要在個人設置里面找到令牌 記住自己的賬號和訪問令牌&#xff08;一長串&#xff09;&#xff0c;后面git要輸入這個&#xff0c; 賬號是下面這個 來到自己的倉庫 #查看遠程倉庫&#xff0c;是不是自己的云倉庫 git remote -v # 創建新分支 git checkout -b llf # 三步…

【Rust自學】6.4. 簡單的控制流-if let

喜歡的話別忘了點贊、收藏加關注哦&#xff0c;對接下來的教程有興趣的可以關注專欄。謝謝喵&#xff01;(&#xff65;ω&#xff65;) 6.4.1. 什么是if let if let語法允許將if和let組合成一種不太冗長的方式來處理與一種模式匹配的值&#xff0c;同時忽略其余模式。 可以…

【Git學習】windows系統下git init后沒有看到生成的.git文件夾

[問題] git init 命令后看不到.git文件夾 [原因] 文件夾設置隱藏 [解決辦法] Win11 win10

vscode添加全局宏定義

利用vscode編輯代碼時&#xff0c;設置了禁用非活動區域著色后&#xff0c;在一些編譯腳本中配置的宏又識別不了 遇到#ifdef包住的代碼就會變暗色&#xff0c;想查看代碼不是很方便。如下圖&#xff1a; 一 解決&#xff1a; 在vscode中添加全局宏定義。 二 步驟&#xff1a…

【服務器主板】定制化:基于Intel至強平臺的全新解決方案

隨著數據處理需求不斷增長&#xff0c;服務器硬件的發展也在持續推進。在這一背景下&#xff0c;為用戶定制了一款全新的基于Intel至強平臺的服務器主板&#xff0c;旨在提供強大的計算能力、優異的內存支持以及高速存儲擴展能力。適用于需要高性能計算、大規模數據處理和高可用…

php怎么去除數點后面的0

在PHP中&#xff0c;我們可以使用幾種方法來去除數字小數點后的0。 方法一&#xff1a;使用intval函數 intval函數可以將一個數字轉化為整數&#xff0c;另外&#xff0c;它也可以去除小數點后面的0。 “php $number 123.4500; $number intval($number); echo $number; // 輸…

數字后端培訓項目Floorplan常見問題系列專題續集1

今天繼續給大家分享下數字IC后端設計實現floorplan階段常見問題系列專題。這些問題都是來自于咱們社區IC后端訓練營學員提問的問題庫。目前這部分問題庫已經積累了4年了&#xff0c;后面會陸續分享這方面的問題。 希望對大家的數字后端學習和工作有所幫助。 數字后端項目Floor…

【遞歸,搜索與回溯算法 綜合練習】深入理解暴搜決策樹:遞歸,搜索與回溯算法綜合小專題(二)

優美的排列 題目解析 算法原理 解法 &#xff1a;暴搜 決策樹 紅色剪枝&#xff1a;用于剪去該節點的值在對應分支中&#xff0c;已經被使用的情況&#xff0c;可以定義一個 check[ ] 紫色剪枝&#xff1a;perm[i] 不能夠被 i 整除&#xff0c;i 不能夠被 per…

Java中各種數組復制方式的效率對比

在 Java 中&#xff0c;數組復制是一個常見的操作&#xff0c;尤其是在處理動態數組&#xff08;如 ArrayList&#xff09;時。Java 提供了多種數組復制的方式&#xff0c;每種方式在性能和使用場景上都有所不同。以下是對幾種主要數組復制方式的比較&#xff0c;包括 System.a…

視頻會議是如何實現屏幕標注功能的?

現在主流的視頻會議軟件都有屏幕標注功能&#xff0c;屏幕標注功能給屏幕分享者講解分享內容時提供了極大的方便。那我們以傲瑞視頻會議&#xff08;OrayMeeting&#xff09;為例&#xff0c;來講解屏幕標注是如何實現的。 傲瑞會議的PC端&#xff08;Windows、信創Linux、銀河…

Framework開發入門(一)之源碼下載

一、使用Linux操作系統的小伙伴可以跳轉到官網鏈接按提示操作 官網源碼地址&#xff1a;下載源代碼 | Android Open Source Project 1.創建一個空目錄來存放您的工作文件。為其指定一個您喜歡的任意名稱&#xff1a; mkdir WORKING_DIRECTORYcdWORKING_DIRECTORY …

改進爬山算法之四:概率爬山法(Probabilistic Hill Climbing,PHC)

概率爬山法(Probabilistic Hill Climbing,PHC)是一種局部搜索算法,它結合了隨機性和貪婪搜索的特點,是對爬山算法(Hill Climbing Algorithm)的一種變體或擴展。與傳統的爬山法不同,PHC不是總是選擇最優的鄰居作為下一步的移動,而是以一定的概率選擇最優鄰居,同時以一…

Unity中實現人物殘影效果

今天火柴人聯盟3公測了&#xff0c;看到一個殘影的效果&#xff0c;很有意思&#xff0c;上網查詢了一下實現方式&#xff0c; 實現思路&#xff1a; 將角色的網格復制出來&#xff0c;然后放置到新建的物體的MeshFilter組件上&#xff0c;每隔幾十毫秒在玩家的位置生成一個&a…

C#實現調用DLL 套殼讀卡程序(桌面程序開發)

背景 正常業務已經支持 讀三代卡了&#xff0c;前端調用醫保封裝好的服務就可以了&#xff0c;但是長護要讀卡&#xff0c;就需要去訪問萬達&#xff0c;他們又搞了一套讀卡的動態庫&#xff0c;為了能夠掉萬達的接口&#xff0c;就需要去想辦法調用它們提供的動態庫方法&…

自動擋有什么優勢

自動擋汽車相比手動擋汽車具有多方面的優勢&#xff0c;以下是對這些優勢的詳細闡述&#xff1a; 一、操作簡便性 無需手動換擋&#xff1a;自動擋汽車不需要駕駛員手動操作離合器和換擋桿&#xff0c;只需通過油門和剎車踏板來控制車速&#xff0c;大大降低了駕駛難度。這使…