【问题标题】:Google sheets published csv sometimes yields html instead of csvGoogle 表格发布的 csv 有时会产生 html 而不是 csv
【发布时间】:2020-11-18 22:27:44
【问题描述】:

以下代码

url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vQDGHMz-ynciGYoHe7Nma6r99qHkscebte8I9COd6dmGZ4jWZtA4_q7U3NT9cPut3v6pmZY5errsS0R/pub?gid=0&single=true&output=csv'

import requests, io
r = requests.get(url)
data = r.content

import pandas as pd
print(data)
df = pd.read_csv(io.BytesIO(data), encoding='utf8', sep=",")

有输出

b'\n<!DOCTYPE html>\n<html lang="en">\n  <head>\n  <meta charset="utf-8">[...];\n  </script>\n  </body>\n</html>\n'
Traceback (most recent call last):
  File "test.py", line 10, in <module>
    df = pd.read_csv(io.BytesIO(data), encoding='utf8', sep=",")
  File "C:\Users\dleve\anaconda3\envs\aaroneller\lib\site-packages\pandas\io\parsers.py", line 686, in read_csv
    return _read(filepath_or_buffer, kwds)
  File "C:\Users\dleve\anaconda3\envs\aaroneller\lib\site-packages\pandas\io\parsers.py", line 458, in _read
    data = parser.read(nrows)
  File "C:\Users\dleve\anaconda3\envs\aaroneller\lib\site-packages\pandas\io\parsers.py", line 1196, in read
    ret = self._engine.read(nrows)
  File "C:\Users\dleve\anaconda3\envs\aaroneller\lib\site-packages\pandas\io\parsers.py", line 2155, in read
    data = self._reader.read(nrows)
  File "pandas\_libs\parsers.pyx", line 847, in pandas._libs.parsers.TextReader.read
  File "pandas\_libs\parsers.pyx", line 862, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas\_libs\parsers.pyx", line 918, in pandas._libs.parsers.TextReader._read_rows
  File "pandas\_libs\parsers.pyx", line 905, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2042, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 6, saw 2

数据输出更长。

pd.read_csv(url) 显示相同的错误,所以我相信数据是 pd.read_csv 接收内容的准确显示。为什么是 html 而不是 csv?

请注意,以下链接以完全相同的方式获得(发布到 csv)会产生 csv 输出。

url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vQG30aRS6AcBtWEzeDQtJJXxwwrDHCg0fqKo3v4GgO5ijbWks__htH0gIQqgb6sQDK4Q87aFttaAijf/pub?gid=0&single=true&output=csv'

import requests, io
r = requests.get(url)
data = r.content

import pandas as pd
print(data)
df = pd.read_csv(io.BytesIO(data), encoding='utf8', sep=",")

生产

b'A,B,C\r\n1,2,3\r\n4,5,6'

并且 pd.read_csv(url) 在这种情况下有效。

【问题讨论】:

    标签: python html pandas csv


    【解决方案1】:

    您的第一个 url 链接到一个不允许所有用户访问的 Google 表格文档,因此它会生成一个 HTML 响应,告诉用户请求表格所有者的授权。第二个 url 链接到一个 Google 表格文档,任何人都可以使用该链接访问它,因此它会按预期生成 CSV。

    【讨论】:

      【解决方案2】:

      您正在阅读对 url 的响应,它是一个 Google Sheet csv 下载链接,而不是 csv 本身。内容将是 html。

      【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2011-08-09
      • 1970-01-01
      • 2021-10-14
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多