首页 > 解决方案 > 使用 BeautifulSoup 从具有不同类的多个跨度中提取文本

问题描述

我正在尝试从通过 BeautifulSoup 解析的网页中提取一些数据。

<div class="product-data-list data-points-en_GB">
<div class="float-left in-left col-totalNetAssets" style="height: 36px;">
<span class="caption">
Net Assets of Share Class
<span class="as-of-date">
as of 20-Jul-20
</span>
</span>
<span class="data">
USD 36,636,694,134
</span>
</div>
<div class="float-left in-right col-totalNetAssetsFundLevel">
<span class="caption">
Net Assets of Fund
<span class="as-of-date">
as of 20-Jul-20
</span>
</span>
<span class="data">
USD 37,992,258,237
</span>
</div>
<div class="float-left in-left col-baseCurrencyCode" style="height: 16px;">
<span class="caption">
Fund Base Currency
<span class="as-of-date">
</span>
</span>
<span class="data">
USD
</span>
</div>

我想从“标题”、“截至日期”和“数据”跨度中捕获信息,以创建类似:[(“股份类别的净资产”、“20 年 7 月 20 日”、“36,636,694,134 美元'), ('基金净资产','20-Jul-20','USD 37,992,258,237'), ('基金基础货币','','USD')]

这是我的代码:

data=[]
for tag in soup.findAll("div", {"id": "keyFundFacts"}):
    for span in tag.findAll("div", {"class": "product-data-list data-points-en_GB"}):
        a = span.find("span", {"class": "caption"}).text
        b = span.find("span", {"class": "as-of-date"}).text
        c = span.find("span", {"class": "data"}).text
        data.append((a,b,c))

但是,当我查看列表“数据”时,我只得到 1 个结果:

<pre>
[('\nNet Assets of Share Class\n\nas of 20-Jul-20\n\n', '\nas of 20-Jul-20\n', '\nUSD 36,636,694,134\n')]
</pre>

除了需要删除新行之外,我知道我缺少一些东西来让脚本通过所有其他跨度,但我已经盯着屏幕这么久了,它并没有变得更清晰。

谁能帮我摆脱痛苦?!

标签: pythonweb-scrapingbeautifulsoup

解决方案


我偶然发现了一个似乎可以解决问题的解决方案:

data=[]
for tag in soup.findAll("div", {"id": "keyFundFacts"}):
    for element in tag.findAll("div", {"class": "product-data-list data-points-en_GB"}):
        for thing in element.findChildren('div'):
            a = thing.findNext("span", {"class": "caption"}).text
            b = thing.findNext("span", {"class": "as-of-date"}).text
            c = thing.findNext("span", {"class": "data"}).text
            data.append((a,b,c))

它并不完美,但希望能正常工作。

谢谢大家


推荐阅读