使用 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>]
这个问题一定是重复的,但为了这个问题,我到处都找不到。
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>]