根据各种参数选择div

2024-06-16 10:06:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个新的网站刮和尝试报废特定的网站与某些参数。现在,我要获取满足以下条件的div:

  1. 我想排除div,它有一些class

  2. 我想排除没有div属性的class

  3. 我想包括div,它有一个特定的id,或者没有任何类,或者除了被忽略的类列表之外还有其他类。

到目前为止,我已经完成了2个条件,包括以下code

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() 

现在,我不知道如何在这里添加第3个条件&如果可能的话,我还想在一个find_all()语句中完成所有3个过滤器。你知道吗


Tags: individ列表for参数属性网站
2条回答

在处理如此复杂的条件时,最好将其包装在单独的函数中。BeautifulSoup允许您使用function as filter。你知道吗

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>]

我可能错过了一些情况,所以请尝试以下与bs4.7.1+使用:不排除或css和语法。请注意,我已将列表中的类名改为选择器,前面加了“.”

from bs4 import BeautifulSoup as bs

classes_to_ignore = [".class1", ".class2", ".class3"]

html = '''
<div class="class1">a</div>
<div class="class2">b</div>
<div class="class3">c</div>
<div class="class4">d</div>
<div>e</div>
<div id="id1" class="class5">f</div>
<div id="id1">g</div>
<div id="id1" class="class1">h</div>
<div id="id1" class="class2">i</div>
'''

soup = bs(html, 'lxml')
ignore = ','.join(classes_to_ignore)
divs = soup.select(f"div[id='id1']:not({ignore}), div:not({ignore})[class]")
print(divs)

相关问题 更多 >