一直都發現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 內容,而在不確定標簽值,例如span
、p
、a
標簽的時候,我們可以提取每個標簽的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
方法,來提取任意標簽下的所有文本。
你可以按照以下步驟操作:
- 導入Selenium的WebDriver和By模塊。
- 創建WebDriver實例。
- 打開目標網頁。
- 使用
find_elements
方法和適當的By類來查找所有你想要的標簽。- 遍歷找到的元素列表,使用
text
屬性來獲取每個元素的文本。- 打印或處理這些文本。
- 關閉瀏覽器。
下面是一個具體的代碼示例:
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'
替換為你想要的標簽名即可。