如何解决报废-熊猫read_html和bs4返回多个空行
我正在尝试使用pandas.read_html()从表中提取一些气候数据,但是它将整个行返回为空。我认为这与网站管理员的某些要求有关,以防止进行网络抓取,但我可能是错的。 我也尝试使用bs4,但结果相同。
熊猫:
import pandas as pd
dfs = pd.read_html('https://www.tutiempo.net/clima/03-2000/ws-879380.html',match='.+',flavor='bs4')
df = dfs[2]
df
输出
Día T TM Tm SLP H PP VV V VM VG RA SN TS FG
0 1 9.9 15 6 1007.4 55 0.76 16.9 11.1 18.3 - NaN NaN NaN NaN
1 2 13.5 19 8.4 1006.9 45 0 17.9 13.3 24.1 51.9 NaN NaN NaN NaN
2 3 9.6 18.9 7 1004.8 77 0.76 16.4 17.4 37 50 o NaN NaN NaN
3 4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN o NaN NaN NaN
4 5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 7 16.6 21 12.6 1000.0 67 0 16.9 20 64.8 85.2 NaN NaN NaN NaN
7 8 12.9 21.2 7.8 1001.7 74 - 16.6 19.1 44.3 72.2 o NaN NaN NaN
8 9 11.3 19 8.4 1005.4 83 1.02 15.9 12 29.4 - o NaN NaN NaN
9 10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
10 11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN o NaN NaN NaN
11 12 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN o NaN NaN NaN
12 13 7.5 12 4 1007.5 85 0.25 17.9 9.4 22.2 - NaN NaN NaN NaN
13 14 7.8 12 4.8 995.4 91 0 15.1 16.5 27.8 - o NaN NaN NaN
14 15 6.5 8 5 984.9 79 2.03 16.6 38.2 48.2 63 NaN NaN NaN NaN
bs4:
import bs4 as bs
import urllib.request
sauce = urllib.request.urlopen('https://www.tutiempo.net/clima/01-2000/ws-879380.html').read()
soup = bs.BeautifulSoup(sauce,'lxml')
table = soup.find("table",{"class": "medias mensuales numspan"})
table_rows = table.find_all('tr')
for tr in table_rows:
td = tr.find_all('td')
row = [i.text for i in td]
print(row)
输出
['1','8.6','13.3','4.8','996.5','64','0','18.3','39.6','59.1','-','\xa0','\xa0']
['2','9.4','13.8','5.8','999.4','69','0.76','20.6','17','55.4','o','\xa0']
['3','8','12.4','6','1001.1','79','1.27','21.1','31.3','\xa0']
['4','','\xa0']
['5','\xa0']
['6','\xa0']
['7','8.3','16.8','4','984.2','5.08','20.9','24.8','74.1','\xa0']
['8','7.3','13.2','3.5','986.3','65','0.51','15','32.6','\xa0']
['9','4.4','0.6','988.4','81','4.06','14.3','28.2','51.9','\xa0']
['10','\xa0']
['11','\xa0']
['12','\xa0']
['13','8.8','10.3','1001.9','78','0.25','18','57','70.2','\xa0']
['14','9.3','11','7.8','1003.8','76','58.2','64.8','\xa0']
如果您检查网站,则行已完成。 任何帮助。
最诚挚的问候, 欧内斯特·沙克尔顿爵士
解决方法
他们正在使用带有附加样式的<span>
标签。附加的样式具有content
属性,它们用于在bs4中显示为空的单元格中建立值。
数据已经存在于HTML中,但是您需要处理样式以获取数据:
一个快速而肮脏的解决方法是假设样式不变,并编写类似以下内容的预处理替换:
str = str.replace('<span class="ntlm">','1')
或str = str.replace('<span class="ntzb">','5')
更好的解决方案是使用css引擎或regex处理样式,在每次加载页面时构建地图,然后应用映射来替换文本。
,问题在于数据在网站上的显示方式。如果检查其元素,则可以看到所需的某些数据与其他数据一起存储。我不确定我是否正确解释了这一点,但我认为最好是自己看看。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。