Python 一种更有效的方法来删除其子元素包含“的元素”;英文「;

Python 一种更有效的方法来删除其子元素包含“的元素”;英文「;,python,beautifulsoup,Python,Beautifulsoup,我有一个html如下 <div id="bodyContent" class="content mw-parser-output"> <div id="mw-content-text" style="direction: ltr;"> <h1 class="section-heading" tabindex="0" aria

我有一个html如下

<div id="bodyContent" class="content mw-parser-output">
    <div id="mw-content-text" style="direction: ltr;">
        <h1 class="section-heading" tabindex="0" aria-haspopup="true" data-section-id="0">
            <span class="mw-headline" id="title_0">pomme</span>
        </h1>
        
        <details data-level="2" open="">
            <summary class="section-heading"><h2 id="English">English</h2></summary>
            <details data-level="3" open="">abc</details>
        </details>

        <details data-level="2" open="">
            <summary class="section-heading"><h2 id="French">French</h2></summary>
            <details data-level="3" open="">abc</details>
        </details>

        <details data-level="2" open="">
            <summary class="section-heading"><h2 id="Norman">Norman</h2></summary>
            <details data-level="3" open="">abc</details>
        </details>
    </div>
</div>
我是靠自己的努力才得到这样的结果的

from bs4 import BeautifulSoup

texte = """
<div id="bodyContent" class="content mw-parser-output">
    <div id="mw-content-text" style="direction: ltr;">
        <h1 class="section-heading" tabindex="0" aria-haspopup="true" data-section-id="0">
            <span class="mw-headline" id="title_0">pomme</span>
        </h1>

        <details data-level="2" open="">
            <summary class="section-heading"><h2 id="English">English</h2></summary>
            <details data-level="3" open="">abc</details>
        </details>
    </div>
</div>
"""

soup = BeautifulSoup(texte, 'html.parser')
tmp = soup.select('details > summary > h2')
tmp2 = [s.contents[0] for s in tmp]

for i in range(len(tmp2)):
    if tmp2[i] != 'English':
        tmp[i].find_parent('details').decompose()
        
soup
从bs4导入美化组
texte=”“”
波姆
英语
abc
"""
soup=BeautifulSoup(文本“html.parser”)
tmp=soup.select('details>summary>h2')
tmp2=[s.contents[0]用于tmp中的s]
对于范围内的i(len(tmp2)):
如果tmp2[i]!='英语':
tmp[i]。查找父项('details')。分解()
汤

我需要重复这个操作近400万次。我想问,有没有一种更有效的方法来做到这一点。非常感谢你的帮助

您可以将CSS选择器与
:not()
一起使用,然后使用
.extract()
所选元素:

for d in soup.select('details[data-level="2"]:not(:has(h2#English))'):
    d.extract()

print(soup.prettify())
印刷品:


波姆
英语
abc

也许可以尝试使用Rabin-Karp字符串搜索,在该搜索中,您对字符串进行散列,并且仅在散列匹配时才查看字符串……我只是在尝试想出一些策略,以便在for循环中更快地匹配字符串@Andrej Kesely可能会更快地使用BeautifulSoup…嗨,Andrej,你能看看并详细解释一下为什么
soup.find('details[data level=“2”]:has(h2#English)
不起作用吗?@LEAnhDung
.find()
方法不接受CSS选择器。改用
.select()
。选择一个()
。非常感谢Andrej。你的回答一如既往地优雅:))
for d in soup.select('details[data-level="2"]:not(:has(h2#English))'):
    d.extract()

print(soup.prettify())