Beautiful Soup Web抓取并使用整数

时间:2020-07-03 11:50:56

标签: python types beautifulsoup casting

我有以下代码,使用BeautifulSoup和Python对与某些冠状病毒统计信息有关的内容进行webscrape(然后算出一个百分比):

url = "https://www.worldometers.info/coronavirus/"
req = requests.get(url)
bsObj = BeautifulSoup(req.text, "html.parser")
data = bsObj.find_all("div",class_ = "maincounter-number")
    
totalcases=data[0].text.strip()
recovered=data[2].text.strip()
print(totalcases+3)

percentagerecovered=recovered/totalcases*100

我遇到的问题是为所恢复的可变百分比生成所需的值。

我想使用整数,但是上面的方法不起作用,所以我尝试了:

percentagecovered=int(recovered)/int(totalcases)*100 but it gave this error:

  File "E:\webscraper\webscraper\webscraper.py", line 17, in <module>
    percentagerecovered=int(recovered)/int(totalcases)*100
ValueError: invalid literal for int() with base 10: '6,175,537'

但是,当我移除演员表,并尝试打印以查看它给出了另一个错误的值时,我正在努力理解。

我将其更改为:

totalcases=data[0].text.strip()
recovered=data[2].text.strip()
print(totalcases+3)

percentagerecovered=recovered/totalcases*100

错误

File "webscraper.py", line 16, in <module>
    print(totalcases+3)
TypeError: can only concatenate str (not "int") to str

我只是想使用split方法获取那些字符串,然后假设它们是整数,然后使用它们。

当前,当我通过它们(不进行强制转换)时,它在页面上不显示任何内容...但是当我强制执行将其转换为int时,我得到了错误。我在做什么错了?

我也尝试过:

totalcases=int(totalcases)
recovered=int(recovered)

但这会产生另一个错误:

File "webscraper.py", line 17, in <module>
    totalcases=int(totalcases)
ValueError: invalid literal for int() with base 10: '11,018,642'

我还尝试了以下操作:(用逗号分隔),如下面注释中所建议:

totalcases=data[0].text.strip()
recovered=data[2].text.strip()
totalcases=totalcases.strip(",")
totalcases=int(totalcases)
recovered=recovered.strip(",")
recovered=int(recovered)
percentagerecovered=recovered/totalcases*100

错误:

totalcases = int(总计) ValueError:int()以10为底的无效文字:“ 11,018,684”

我注意到像下面的函数这样的解决方案(我还没有尝试过),但是对于我想做的事情,它们似乎不必要地复杂。最好,最简单/最优雅的解决方案是什么?

这似乎正确,但仍然会产生错误:

int(totalcases.replace(',', ''))
int(recovered.replace(',', ''))

错误:

File "webscraper.py", line 25, in <module>
    percentagerecovered=recovered/totalcases*100
TypeError: unsupported operand type(s) for /: 'str' and 'str'

2 个答案:

答案 0 :(得分:2)

我写了这个小函数,可以为您返回一个数字,因此您可以增加它或做任何想要的事

def str_to_int(text=None):
    if text == None:
        print('no text')
    else:
        text = text.split(',')
        num = int(''.join(text))
        return num

例如,您的总箱数为:'11,018,642',因此您可以这样做:

totalcases = str_to_int('11,018,642')

现在您可以执行totalcases*100或其他任何操作

答案 1 :(得分:1)

另一种简单的方法:

totalcases= int(data[0].text.strip().replace(',',''))
recovered = int(data[2].text.strip().replace(',',''))