欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > 【Python】使用匿名函数Lambda解析html源码的任意元素(Seleinium ,BeautifulSoup皆适用)

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

2025/2/24 16:43:43 来源:https://blog.csdn.net/Meggie35/article/details/144431770  浏览:    关键词:【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'替换为你想要的标签名即可。

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词