【问题标题】:Python scraping from tablePython从表中抓取
【发布时间】:2021-02-24 18:31:46
【问题描述】:

因为很多时候我都在努力寻找解决方案。我想从网站上获取一张表格并将这张表格放入熊猫数据框中。我已经得到了表格的标题(头)。但是我迷失了 tbody 对应的 tr 和 td 标签。

我认为对于数据框,我首先需要一个列表字典: dict{'state1':['value1',value2'...], 'state2':['value1','value2'..], ... }

稍后将其与标头组合到 DataFrame 中。

现在导入: 首先我导入包:

from bs4 import BeautifulSoup
import requests
import pandas as pd

之后我会解析 url 并定义我需要的正文:

url='https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html'
html=requests.get(url).text
soup=BeautifulSoup(html,'html.parser')

content=soup.find(attrs={'id':'wrapperDivisions-2'})
table=content.table
body=table.tbody

(我想我也可以写 body=content.table.body)

之后我尝试了两种不同的发现。

发现没有 1:

key=[]
values=[]
parent=body.find_all(name='tr')
child=body.find_all(name='tr')[0].find_all(name='td')



for i in range(1,len(parent)):
   
    for j in range(1,len(child)+1):
        if j==1:
            key.append(body.select_one('#main > div.text > table > tbody > tr:nth-child({}) > td:nth-child({})'
                                       .format(i,j)).text)
        else:
            values.append(body.select_one('#main > div.text > table > tbody > tr:nth-child({}) > td:nth-child({})'
                                          .format(i,j)).text)
  

输出:

--key--
['Baden-Württem\xadberg', 'Bayern', 'Berlin', 'Branden\xadburg', 'Bremen', 'Hamburg', 'Hessen', 'Meck\xadlenburg-\nVor\xadpommern', 'Nieder\xadsachsen', 'Nord\xadrhein-West\xadfalen', 'Rhein\xadland-Pfalz', 'Saarland', 'Sachsen', 'Sachsen-Anhalt', 'Schles\xadwig-Holstein', 'Thüringen']
--values--
['312.399', '874', '5.054', '46', '7.985', '430.386', '950', '7.243', '55', '12.233', '127.483', '296', '1.973', '54', '2.766', '75.337', '292', '1.592', '63', '2.948', '17.584', '66', '490', '72', '329', '50.673', '162', '1.176', '64', '1.235', '185.434', '681', '3.789', '60', '5.751', '23.712', '205', '1.038', '65', '714', '160.402', '749', '4.817', '60', '4.204', '524.022', '1.838', '10.926', '61', '12.800', '100.633', '279', '2.124', '52', '3.031', '28.369', '134', '606', '61', '852', '191.563', '514', '2.696', '66', '7.529', '59.049', '232', '1.787', '81', '2.339', '41.468', '258', '1.454', '50', '1.245', '74.304', '477', '2.530', '119', '2.779']

解决方案看起来不错,但我只得到两个列表。一个包含状态的列表和一个包含值的列表。 在这里,我遇到了将其转换为所需格式作为字典的问题。

发现没有。 2:

   key=[]
    values=[]
    for i in range(1,len(parent)):
    x=body.select('#main > div.text > table > tbody > tr:nth-child({})'.format(i))
    print('---')
    for j in x[0].find_all(name='td'):
    key.append()
    print(j.text)
    print('+++')      

输出如下:

---
Baden-Württem­berg
+++
312.399
+++
874
+++
5.054
+++
46
+++
7.985
+++
---
Bayern
+++
430.386
+++
950
+++
7.243
+++
55
+++
12.233
+++
---

这似乎正是我想要的。但我的问题是,我不能将它分配给键/值。 所以我无法将其转换为构建字典并将其读入数据框的格式。 我希望页面是用德语写的没有问题。

我会很高兴看到干净解决方案的每一个提示。 非常感谢。

【问题讨论】:

  • 你好,我不知道为什么,但它总是删除我在第一行的“你好”。再说一次,大家好:)

标签: python web-scraping beautifulsoup


【解决方案1】:

pandas 有一个read_html 从表中提取数据的方法:

import pandas as pd
import requests

r = requests.get("https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html")
data = pd.read_html(r.text)
print(data)

【讨论】:

  • 谢谢!非常容易解决问题。用 df=data[0] 我把它变成了一个数据框。
猜你喜欢
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多