使用 BeautifulSoup 查找具有不同 id 值的所有 div 元素

Finding all div elements with varying id value with BeautifulSoup

这个问题一定是重复的,但为了这个问题,我到处都找不到。

html = """
<html>
<head>
</head>
<body>
<div id="7471292"></div>
<div id="5235252"></div>
<div href="/some/link/"></div>
<div id="7567327"></div>
<div id="1231312"></div>
<div class="card d-inline-block iteml_card elems3 section1 featured0 wished0"</div>
<div id="2342424"></div>
</body>
</html>
"""

#Create soup from html
soup = BeautifulSoup(html)

我想要以下输出:

[<div id="7471292"></div>,
 <div id="5235252"></div>,
 <div id="7567327"></div>,
 <div id="1231312"></div>,
 <div id="2342424"></div>]

我们可以这样做:

soup.find_all("div")

但这将 return 所有 div。如果我们想指定一个 id 吸引子,我们也必须填写一个简洁的值,看起来没有用:

soup.find_all('div', {'id': ""})

你需要的是正则表达式和汤的组合:

from bs4 import BeautifulSoup
import re
html = """
<html>
<head>
</head>
<body>
<div id="7471292"></div>
<div id="5235252"></div>
<div href="/some/link/"></div>
<div id="7567327"></div>
<div id="1231312"></div>
<div class="card d-inline-block iteml_card elems3 section1 featured0 wished0"</div>
<div id="2342424"></div>
</body>
</html>
"""

soup = BeautifulSoup(html)
soup.find_all('div', {'id': re.compile("\d+")})

输出

[<div id="7471292"></div>,
 <div id="5235252"></div>,
 <div id="7567327"></div>,
 <div id="1231312"></div>,
 <div id="2342424"></div>]

如果您有兴趣使用 ID 包含数字、字母或两者组合的 div 标签,请尝试使用 ([\d\w]+).

而不是使用 (\d+)

您可以传入一个 lambda 函数来检查 id 是否只包含数字。正则表达式在这里有点矫枉过正。

soup = BeautifulSoup(html)
print(soup.find_all("div", id=lambda x: x is not None and x.isnumeric()))

这输出:

[<div id="7471292"></div>, <div id="5235252"></div>,
<div id="7567327"></div>, <div id="1231312"></div>, <div id="2342424"></div>]

会发生什么?

您已接近您的目标 - 但是 soup.find_all('div', {'id': ""}) 将被解释为空或 non-existent 属性 id,这就是您无法获得预期 ResultSet 的原因.

如何修复?

没什么可做的,在你的情况下它真的不需要 regex,只需使用 keyword arguments 并将你的属性设置为 True:

soup.find_all('div', id=True)

使用字典语法:

soup.find_all('div', {'id':True})

或等效的 css selector:

soup.select('div[id]')

例子

html = """
<html>
<head>
</head>
<body>
<div id="7471292"></div>
<div id="5235252"></div>
<div href="/some/link/"></div>
<div id="7567327"></div>
<div id="1231312"></div>
<div class="card d-inline-block iteml_card elems3 section1 featured0 wished0"</div>
<div id="2342424"></div>
</body>
</html>
"""

#Create soup from html
soup = BeautifulSoup(html)
soup.find_all('div', {'id':True})

输出

[<div id="7471292"></div>,
 <div id="5235252"></div>,
 <div id="7567327"></div>,
 <div id="1231312"></div>,
 <div id="2342424"></div>]