一直都发现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'
替换为你想要的标签名即可。