python - 根据各种参数选择div
问题描述
我是网络抓取的新手,并试图用某些参数抓取特定网站。现在,我想获取满足以下条件的 div:
我想排除
div
其中具有确定性class
的内容。我想排除
div
没有class
属性的。我想包含
div
一个特定id
的并且没有任何类或除了被忽略的类列表之外的类。
现在,到目前为止,我已经使用以下代码完成了 2 个条件:
classToIgnore = ["class1", "class2", "class3"]
for div in soup.find_all('div', class_=lambda x: x in classToIgnore):
div.decompose()
for div in soup.find_all('div', class_=False):
div.decompose()
find_all()
现在,我不知道如何在此处添加第三个条件,并且如果可能的话,我还想在单个语句中执行所有 3 个过滤器。
解决方案
在处理如此复杂的情况时,将其包装在单独的函数中始终是最佳实践。BeautifulSoup 允许你使用一个函数作为过滤器。
from bs4 import BeautifulSoup, Tag
html = """
<div class="c1"></div>
<div class="c1" id="myid">
<div class="c1"></div>
</div>
<div class="c2"></div>
<div class="c3" id="myid"></div>
<div class="c4"></div>
<div></div>
<div id="myid"></div>
"""
soup = BeautifulSoup(html, 'html.parser')
classToIgnore = ["c1", "c2"]
# Using decompose to solve cases where
# unwanted classes comes inside wanted classes
for div in soup.find_all('div', class_=lambda x: x in classToIgnore):
div.decompose()
def my_filter(ele):
if (
isinstance(ele, Tag) and
ele.name == 'div' and
ele.get('id') == 'myid' and not ele.get('class') or
ele.get('class')
):
return True
print(soup.find_all(my_filter))
输出
[<div class="c3" id="myid"></div>, <div class="c4"></div>, <div id="myid"></div>]
推荐阅读
- python - 如何将字符串的第一个和第四个字符大写?
- c++ - 如何将用户输入从控制台传递到不同线程中的对象-> QTcpsocket
- splunk - 如何每秒获取单个字段的结果
- java - 无法从另一个模块反射地实例化“打开”包的“受保护”类
- python-3.x - 从脚本向超过 1 个收件人发送电子邮件
- c# - 试图通过数据绑定将属性更新从对象传递到 gui
- python - 如何在同时运行的两个并行进程之间创建依赖关系
- javascript - 将函数的特定变量导出到另一个文件
- php - 每个实体项的 ManyToMany 关系表中的 Symfony 查询 id
- rust - PhantomData 类型在 rust 中的使用