使用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>

我想从"标题"、"截止日期"one_answers"数据"跨度中捕获信息,以创建类似的内容:[("股份类别净资产","20年7月20日","36636694134美元"(,("基金净资产","20年7月20日","37992258237美元"(,("基金基础货币"、"、"美元"(]

这是我的代码:

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 Classnnas of 20-Jul-20nn', 'nas of 20-Jul-20n', 'nUSD 36,636,694,134n')]
</pre>

除了需要去掉新的台词外,我知道我错过了一些东西,让剧本经历所有其他的跨度,但我已经盯着屏幕看了这么长时间,它并没有变得更清楚。

有人能帮我摆脱痛苦吗?!

一个解决方案是循环遍历main下的所有div元素"div";,{"class":"product data list data-points-en_GB&"元素。这样,对于每个div元素,您都可以获得所需的元素。

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

这会导致很多嵌套循环,所以我不建议这样做。我建议找一个更精确的方法。如果你有一个带有html的url,我可以看看。

我偶然发现了一个似乎能奏效的解决方案:

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))

它并不完美,但有望发挥作用。

感谢所有

最新更新