基于一个包含统计信息的网站,我实现了基本的Web抓取代码,如下所示:
import re
import requests
from bs4 import BeautifulSoup
content = requests.get("https://www.geostat.ge/ka/modules/categories/26/samomkhmareblo-fasebis-indeksi-inflatsia")
content = BeautifulSoup(content.content, 'html.parser')
#print(content.prettify())
information = []
for row in content.select('tbody tr'):
for data in row.find_all('td'):
if len(data.text.strip()) != 0:
information.append(data.text.strip())
print(information)
它返回以下信息:
['2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', 'საშუალო წლიური წინა წლის საშუალო წლიურთან', '99.1', '99.5', '103.1', '104.0', '102.1', '106.0', '102.6', '104.9', '105.2', '109.6', '111.9', '102.5', 'დეკემბერი წინა წლის დეკემბერთან', '98.6', '102.4', '102.0', '104.9', '101.8', '106.7', '101.5', '107.0', '102.4', '113.9', '109.8', '100.4'
现在文本前面的第一部分包含‘საშუალო’年份,其余部分是两个文本之间的通货inflating ,所以我实现了这个非常手动的代码:
years = []
average_annual = []
december = []
first_index = information.index('საშუალო წლიური წინა წლის საშუალო წლიურთან')
second_index = information.index('დეკემბერი წინა წლის დეკემბერთან')
for i in range(0, first_index):
years.append(int(information[i]))
print(years)
for i in range(first_index + 1, second_index):
average_annual.append(float(information[i]))
print(average_annual)
for i in range(second_index + 1, len(information)):
december.append(float(information[i]))
print(december)
它显示了正确的分隔:
[2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]
[99.1, 99.5, 103.1, 104.0, 102.1, 106.0, 102.6, 104.9, 105.2, 109.6, 111.9, 102.5]
[98.6, 102.4, 102.0, 104.9, 101.8, 106.7, 101.5, 107.0, 102.4, 113.9, 109.8, 100.4]
有没有更好的方法来做到这一点?
我试过这个版本:
data = pd.DataFrame(pd.read_html("https://www.geostat.ge/ka/modules/categories/26/samomkhmareblo-fasebis-indeksi-inflatsia", encoding='utf-8')[0])
#data.drop(0, axis=0, inplace=True)
#data = data.droplevel(level=0, axis=1)
print(data)
并返回以下结果:
0 1 ... 11 12
0 NaN 2012.0 ... 2022.0 2023.0
1 საშუალო წლიური წინა წლის საშუალო წლიურთან 99.1 ... 111.9 102.5
2 დეკემბერი წინა წლის დეკემბერთან 98.6 ... 109.8 100.4
[3 rows x 13 columns]
我该怎么处理这个案子呢?