Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列';在连接刮取的数据帧时,s类型已更改_Python_Python 3.x_Pandas_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 列';在连接刮取的数据帧时,s类型已更改

Python 列';在连接刮取的数据帧时,s类型已更改,python,python-3.x,pandas,web-scraping,beautifulsoup,Python,Python 3.x,Pandas,Web Scraping,Beautifulsoup,我遇到了一些麻烦,在互联网上找不到任何答案(这是非常罕见的!!) 我正在按城市进行每日粒度的网络垃圾收集(气象数据)。 当我刮取1天时,“city”列被认为是字符串,但当我刮取超过1天(如2天)时,“city”列不再是字符串,与1天刮取时使用的代码相同,在2天刮取中不再有效 这是我的刮削代码 url_template = 'https://www.wetterkontor.de/de/wetter/deutschland/extremwerte.asp?id={}' def get_weathe

我遇到了一些麻烦,在互联网上找不到任何答案(这是非常罕见的!!)

我正在按城市进行每日粒度的网络垃圾收集(气象数据)。 当我刮取1天时,“city”列被认为是字符串,但当我刮取超过1天(如2天)时,“city”列不再是字符串,与1天刮取时使用的代码相同,在2天刮取中不再有效

这是我的刮削代码

url_template = 'https://www.wetterkontor.de/de/wetter/deutschland/extremwerte.asp?id={}'
def get_weather(date):
  url = url_template.format(date)
  html_doc = requests.get(url).text
  soup = BeautifulSoup(html_doc)
  table = soup.find('table', id="extremwerte")

  rows = []
  for row in table.find_all('tr'):
      rows.append([val.text for val in row.find_all('td')])

  headers= [header.text for header in table.find_all('th')]
  df = pd.DataFrame(rows[2:], columns=headers)
  df['date']=date
  return df

df2 = pd.DataFrame()
df2 = df2.fillna(0)
for d in pd.date_range(start='20170101', end='20170101'):
df2=pd.concat([df2,get_weather(d.strftime('%Y%m%d'))])
当我只为上面提到的20170101擦写时,下面这行代码起作用:

for i, row in df2.iterrows():
  if isinstance(df2['Wetterstation\xa0'][i],str) is True:
      df2.at[i,'Wetterstation\xa0']=df2['Wetterstation\xa0'][i].replace('/','-')
但是,例如,当我将结束日期更改为20170202时,代码将不起作用,并给出以下错误消息: AttributeError:“Series”对象没有属性“encode”

你能解释一下发生了什么变化吗?为什么当我刮一天以上时,列的类型会发生变化


提前感谢您抽出时间

似乎您需要指定正确的解析器,在本例中,
lxml
(标准
html.parser
产生不正确的结果)

为结束日期运行此代码
20170202

import requests
import pandas as pd
from bs4 import BeautifulSoup


url_template = 'https://www.wetterkontor.de/de/wetter/deutschland/extremwerte.asp?id={}'
def get_weather(date):
    url = url_template.format(date)
    html_doc = requests.get(url).text
    soup = BeautifulSoup(html_doc, 'lxml')   # <--- specify `lxml` parser
    table = soup.find('table', id="extremwerte")

    rows = []
    for row in table.find_all('tr'):
        rows.append([val.text for val in row.find_all('td')])

    headers= [header.text for header in table.find_all('th')]
    df = pd.DataFrame(rows[2:], columns=headers)
    df['date']=date
    return df

df2 = pd.DataFrame()
df2 = df2.fillna(0)
for d in pd.date_range(start='20170101', end='20170202'):
    df2=pd.concat([df2,get_weather(d.strftime('%Y%m%d'))])
print(df2)

仅供参考熊猫可以使用
pd.read\u HTML(url)
将包含表格的HTML直接读取到数据帧列表中。不确定根本的问题是什么,但这可能会有所帮助。谢谢@BallpointBen,当我使用
pd.read\u html(url)
时,我松开了十进制值的逗号,因此一个值(例如='5,7'将被废弃为='57'。你知道如何避免这个问题吗:)?@BallpointBen多亏了这个
pd.read_html(url,decimal=',',millends=')
谢谢你的帮助!谢谢你,安德烈,不幸的是我仍然有同样的问题。例如,下面这行代码将在只有一天被废弃时起作用,但在两天被废弃时不起作用
df2['Wetterstation\xa0'].split('(')[0]
这将导致以下错误:“Series”对象没有属性“split”
                               Wetterstation  MinimumTemp.[°C] MaximumTemp.[°C] Minimum 5 cmüber dem Erd-boden (Nacht) Schnee-höhe[cm] StärksteWindböe[Bft] Nieder-schlag[l/m2] Sonnen-scheindauer[h]      date
0                                      Aachen             -5,1              1,9                                   -6,9               0                  644                 1,9                   5,3  20170101
1                         Ahaus (Münsterland)             -1,2              0,7                                     -1               0                  429                 3,9                     0  20170101
2           Albstadt (Schwäbische Alb, 759 m)             -9,9              4,2                                  -10,8                                                        0                   7,1  20170101
3      Aldersbach (Lkr. Passau, Niederbayern)             -8,3             -1,7                                   -7,8                                                        0                   4,9  20170101
4                              Alfeld (Leine)             -4,1              1,6                                   -4,4               0                  322                 1,6                   1,5  20170101
..                                        ...              ...              ...                                    ...             ...                  ...                 ...                   ...       ...
965                               Zernien (N)                                                                                                                                 0                        20170202
966                               Zielitz (N)                                                                                                                                 0                        20170202
967  Zinnwald-Georgenfeld (Erzgebirge, 877 m)             -7,4              0,2                                   -0,2              55                  540                 0,5                     0  20170202
968                                 Zugspitze             -7,3             -5,3                                                    235                12123                   0                   5,8  20170202
969         Zwiesel (Bayerischer Wald, 612 m)             -4,4              9,3                                   -0,3              44                  213                 0,1                   2,4  20170202

[27841 rows x 9 columns]