【问题标题】:Selecting proper div class with BeautifulSoup使用 BeautifulSoup 选择适当的 div 类
【发布时间】:2018-08-02 17:43:16
【问题描述】:

我有一个包含 3 种 div 类的 html:

<div class="message">
<div class="message message__current">
<div class="message message__current message--grouped">

当我这样做时

all_messages_2 = soup.find_all("div", class_="message message__current")

它只选择div的类型2。

但是当我只想选择类型 1 时,我会这样做

all_messages_1 = soup.find_all("div", class_="message")

它选择所有 3 种类型的 div。

你能帮忙吗?

【问题讨论】:

  • 您忘记告诉我们您想要实现的目标是什么?选择第三个 div 还是第二个?
  • 首先我只想选择&lt;div class="message message__current"&gt;,对内容做一些操作。然后我只想选择&lt;div class="message"&gt; 并做类似的操作。所以我有第二个选择的问题。

标签: python-3.x parsing beautifulsoup html-parsing


【解决方案1】:

使用 lambda 选择每个 div 标签,其 class 属性与您想要的完全匹配。

from bs4 import BeautifulSoup

html = """
<div class="message">
<div class="message message__current">
<div class="message message__current message--grouped">
"""
soup = BeautifulSoup(html, 'html.parser')


tags = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['message'])
print (len(tags))

tags = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['message', 'message__current'])
print (len(tags))

tags = soup.find_all(lambda tag: tag.name == 'div' and tag.get('class') == ['message', 'message__current', 'message--grouped'])
print (len(tags))

输出:

1
1
1

请注意,没有结束标签的方式将被解释为所有标签都在 HTML 末尾关闭。因此,从第一个中选择文本也将包含其他两个中的所有文本。同样,从第二个中选择文本将具有来自第三个的文本。

【讨论】:

  • @ Dan-Dev,感谢演示。为此加一。在过去的几天里,我一直在尝试理解 lambda 函数并且看到你的演示似乎我开始理解它了。但是,您能否提供任何我可以了解更多信息的链接。再次感谢。
  • @novice-coder 一个快速的谷歌搜索显示了很多结果。快速浏览python-course.eu/lambda.php 似乎涵盖了您想知道的大部分内容。
  • 谢谢@Dan-Dev
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多