【问题标题】:Get div content inside a div BeautifulSoup获取 div BeautifulSoup 中的 div 内容
【发布时间】:2021-04-15 10:29:45
【问题描述】:

我有一个格式如下的网站:

<html lang="en">
<head>
    #anything
</head>
<body>
    <div id="div1">
        <div id="div2">
            <div class="class1">
                #something
            </div>
            <div class="class2">
                #something
            </div>
            <div class="class3">
                <div class="sub-class1">
                    <div id="statHolder">
                        <div class="Class 1 of 15">
                            "Name"
                            <b>Bob</b>
                        </div>
                        <div class="Class 2 of 15">
                            "Age"
                            <b>24</b>
                        </div>
                        # Here are 15 of these kinds
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

我想检索这 15 个类中的所有内容。我该怎么做?

编辑: 我目前的做法:

import requests
from bs4 import BeautifulSoup

url = 'my-url-here'
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
name_box = soup.findAll('div', {"id": "div1"}) #I dont know what to do after this

预期输出:

Name: Bob
Age: 24
#All 15 entries like this

我为此使用 BeautifulSoup4。 有什么直接的方法可以获取&lt;div id="stats"&gt;中的所有内容吗?

【问题讨论】:

  • 您当前的代码/方法是什么?您寻求的预期输出究竟是什么?
  • @costaparas 问题已编辑 :)

标签: html python-3.x web-scraping beautifulsoup python-3.8


【解决方案1】:

根据上面的HTML,你可以这样试试:

import requests
from bs4 import BeautifulSoup

result = {}
url = 'my-url-here'
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
stats = soup.find('div', {'id': 'statHolder'})
for data in stats.find_all('div'):
    key, value = data.text.split()
    result[key.replace('"', '')] = value

print(result)
# Prints:
# [{'Name': 'Bob'}, {'Age': '24'}]

for key, value in result.items():
    print(f'{key}: {value}')
# Prints: 
# Name: Bob
# Age: 24

这会找到divstatHolderid

然后,我们在div 中找到所有divs,并提取两行文本(使用split)——第一行是键,第二行是值。我们还使用 replace 从值中删除双引号。

然后,我们将键值对添加到我们的 result 字典中。

通过这个迭代,你可以得到想要的输出,如图所示。

【讨论】:

  • 错误for data in stats.findAll('div'): AttributeError: 'NoneType' object has no attribute 'findAll'
  • 我在 HTML 中看到父级div 具有statsid,所以使用它,即&lt;div id="stats"&gt;。如果它有所不同,那么您必须将其调整为正确的 ID
  • 我明显改了。将stats重命名为网站上的原名
  • 另外,我给了网址,你也可以试试..
  • HTML 位于网站的 JavaScript 函数中 - 因此以这种方式解析它有点棘手。您需要使用 Selenium 来获取页面,并让 JS 运行,然后您可以提取数据。
【解决方案2】:

如果您根据网页的实际 html 执行此操作,以下将为您提供作为字典的统计信息。它以类pSt的每个元素为键,然后移动到下面的强标签以获取关联的值。

from bs4 import BeautifulSoup as bs
#html is response.content assuming not dynamic
soup = bs(html, 'html.parser')
stats = {i.text:i.strong.text for i in soup.select('.pSt')}

对于您显示的 html,您可以使用 stripped_strings 来获取第一个兄弟

from bs4 import BeautifulSoup as bs

html = '''
<html lang="en">
<head>
    #anything
</head>
<body>
    <div id="div1">
        <div id="div2">
            <div class="class1">
                #something
            </div>
            <div class="class2">
                #something
            </div>
            <div class="class3">
                <div class="sub-class1">
                    <div id="statHolder">
                        <div class="Class 1 of 15">
                            "Name"
                            <b>Bob</b>
                        </div>
                        <div class="Class 2 of 15">
                            "Age"
                            <b>24</b>
                        </div>
                        # Here are 15 of these kinds
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>
'''
soup = bs(html, 'html.parser')
stats = {[s for s in i.stripped_strings][0]:i.b.text for i in soup.select('#statHolder [class^=Class]')}
print(stats)

【讨论】:

  • 有没有办法在这段代码中集成硒,以便它与动态网页一起工作?或者下载 html 文件并对其进行处理?
  • 您仍然需要手动绕过验证码,但请随时提出有关使用 selenium 进行自动化的问题并解释您必须解决的问题,
  • 该验证码是否也会阻止我以.html 的身份下载网页?因为在那之后你的代码就完美了!
  • 对于 selenium,您可以将 driver.page_source 传输到 bs4 以解析 html。
  • @YasserKhalil 请看这个:pastebin.com/4EGQY7hL
猜你喜欢
  • 2015-01-05
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2013-06-27
  • 2017-10-20
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多