如何使用BeautifulSoup从类中只提取一个元素?

2024-04-25 20:54:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用BeautifulSoup收集筹款信息,但在试图将筹款金额等要素与筹款目标分离时遇到了麻烦

以下是迄今为止的代码:

from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
from time import sleep
import requests
import re
import json

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')
Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()

代码可以工作,但是当我查看结果时,它看起来是这样的:

print(Amount_raised)
882,521 $ raised of 1,000,000 $ goal

理想情况下,我只希望返回数字“882521”,或者更好的是,将其解析为两个变量,一个是筹资金额,另一个是筹资目标

我觉得应该有一种方法来指定我想要的元素,或者使用正则表达式来隔离它,但我的搜索并没有取得成果,而且我对python还相当陌生

编辑:这是我尝试使用的HTML部分

<h2 class="m-progress-meter-heading">882,521 $<!-- --> <span class="text-stat text-stat-title">raised of 1,000,000 $ goal</span>

Tags: 代码textfromimport目标getaspage
3条回答

你可以处理你得到的文本

Amount_raised.split(" ")[0]

完整代码:

from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')

Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()
print(Amount_raised.split(" ")[0])

您还可以跳过.get_text(),然后您可以从<h2>中查找并删除标记<span>(使用.extrude()),接下来您可以使用.get_text()<h2>中获取文本

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
item.find('span').extrude()
Amount_raised = item.get_text()

完整代码:

from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
item.find('span').extract()
Amount_raised = item.get_text()
print(Amount_raised)

您还可以在<h2>中获取包含所有strings的列表,然后来自<span>的文本将作为列表上的分隔元素

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
print( list(item.strings)[0] )

完整代码:

from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
print(list(item.strings)[0])

编辑:其他示例:

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]

print( item.next )
print( list(item.children)[0] )

我发现最简单的方法是:

Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')
print(Amount_raised[0].contents[0])

印刷品882521美元


在此处找到解决方案:Only extracting text from this element, not its children

如果您想获得目标和实际筹集的金额,请尝试:

amts = Amount_raised.split(' ')
locs = [i for i, x in enumerate(amts) if  "$" in x]
print('Amount raised: $'+amts[locs[0]-1])
print('Goal : $'+amts[locs[1]-1])

输出:

Amount raised: $882,521
Goal : $1,000,000

相关问题 更多 >

    热门问题