我正在尝试使用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', '\xa0', '\xa0']
['2', '9.4', '13.8', '5.8', '999.4', '69', '0.76', '20.6', '17', '55.4', '-', 'o', '\xa0', '\xa0', '\xa0']
['3', '8', '12.4', '6', '1001.1', '79', '1.27', '18.3', '21.1', '31.3', '-', 'o', '\xa0', '\xa0', '\xa0']
['4', '', '', '', '', '', '', '', '', '', '', 'o', '\xa0', '\xa0', '\xa0']
['5', '', '', '', '', '', '', '', '', '', '', '\xa0', '\xa0', '\xa0', '\xa0']
['6', '', '', '', '', '', '', '', '', '', '', '\xa0', '\xa0', '\xa0', '\xa0']
['7', '8.3', '16.8', '4', '984.2', '64', '5.08', '20.9', '24.8', '74.1', '-', 'o', '\xa0', '\xa0', '\xa0']
['8', '7.3', '13.2', '3.5', '986.3', '65', '0.51', '15', '32.6', '55.4', '-', 'o', '\xa0', '\xa0', '\xa0']
['9', '4.4', '12.4', '0.6', '988.4', '81', '4.06', '14.3', '28.2', '51.9', '-', 'o', 'o', '\xa0', '\xa0']
['10', '', '', '', '', '', '', '', '', '', '', 'o', '\xa0', '\xa0', '\xa0']
['11', '', '', '', '', '', '', '', '', '', '', 'o', '\xa0', '\xa0', '\xa0']
['12', '', '', '', '', '', '', '', '', '', '', 'o', '\xa0', '\xa0', '\xa0']
['13', '8.8', '10.3', '6', '1001.9', '78', '0.25', '18', '57', '70.2', '-', '\xa0', '\xa0', '\xa0', '\xa0']
['14', '9.3', '11', '7.8', '1003.8', '76', '0', '18.3', '58.2', '64.8', '-', '\xa0', '\xa0', '\xa0', '\xa0']
如果您检查网站,则行已完成。 任何帮助。
最诚挚的问候, 欧内斯特·沙克尔顿爵士
答案 0 :(得分:1)
他们正在使用带有附加样式的<span>
标签。附加的样式具有content
属性,它们用于在bs4中显示为空的单元格中建立值。
数据已经存在于HTML中,但是您需要处理样式以获取数据:
一个快速而肮脏的解决方法是假设样式不变,并编写类似以下内容的预处理替换:
str = str.replace('<span class="ntlm">', '1')
或str = str.replace('<span class="ntzb">', '5')
更好的解决方案是使用css引擎或regex处理样式,在每次加载页面时构建地图,然后应用映射来替换文本。
答案 1 :(得分:0)
问题在于数据在网站上的显示方式。如果检查其元素,则可以看到所需的某些数据与其他数据一起存储。我不确定我是否正确解释了这一点,但我认为最好是自己看看。