【问题标题】:How to read from a url directly as a list verbatim?如何直接从 url 逐字逐句读取?
【发布时间】:2020-05-23 21:44:12
【问题描述】:

我有一个只包含一个列表的 url。例如,路径 https://somepath.com/dev/doc/72 简单返回(无 html 代码):

[
  "A/RES/72/1", 
  "A/RES/72/2", 
  "A/RES/72/3", 
  "A/RES/72/4"
]

我想获取全部内容(包括方括号)并将其制成一个列表。手动完成,我可以像这样复制/粘贴为列表:

docs = [
  "A/RES/72/1", 
  "A/RES/72/2", 
  "A/RES/72/3", 
  "A/RES/72/4"
]
print(docs)
['A/RES/72/1', 'A/RES/72/2', 'A/RES/72/3', 'A/RES/72/4']

我想将 url 的内容传递给列表。

我尝试了以下

link = "https://somepath.com/dev/doc/72"
f = urlopen(link)
myfile = f.read()
print(myfile)
b'[\n  "A/RES/72/1", \n  "A/RES/72/2", \n  "A/RES/72/3", \n  "A/RES/72/4"\n]\n

这是一个混乱的新行而不是一个列表。

我猜我必须解析每一行,删除 \n 字符,或者像这样: file.read().splitlines() ,但对于如此简单的输入,这似乎过于复杂。

我见过很多解析 .csv 文件、从每一行读取输入等的解决方案。但没有什么可以处理已经制作的列表,只需要调用。感谢您的帮助和指点。

编辑: 我试过这个:

import urllib.request  # the lib that handles the url stuff
link = "https://somepath.com/dev/doc/72"
a=[]
for line in urllib.request.urlopen(link):
    print(line.decode('utf-8'))
    a.append(line)

a

print 命令给了我一些接近我想要的东西。但是append 命令又让我一团糟:

[b'[\n',
 b'  "A/RES/72/1", \n',
 b'  "A/RES/72/2", \n',
 b'  "A/RES/72/3", \n',
 b'  "A/RES/72/4"\n',
 b']\n']

编辑:原来 url 提供的是 JSON。以下是fuglede的解决方案(https://stackoverflow.com/a/60119016/10764078):

import requests
docs = requests.get('https://somepath.com/dev/doc/72').json()

我将阅读 JSON。

【问题讨论】:

  • ast.literal_eval() 能解决问题吗?
  • @AMC:在给出的示例中失败。
  • 返回值上的Content-Type: 是什么?看起来可能是 JSON,requests 支持为您解析 JSON 回复,或者您可以使用 json 模块自己解析。
  • 你试过a.append(line.decode('utf-8'))吗?

标签: python json urllib


【解决方案1】:

这适用于您提供的示例:

ast.literal_eval(str(myfile)[2:-1].replace("\\n",""))

【讨论】:

  • 我得看看 ask.literal_eval()。 Fuglede 的答案效果很好,所以我接受了那个。我以后会试试你的。谢谢!
【解决方案2】:

假设网站向您发送的内容是 JSON,使用 requests,则可以通过

import requests
docs = requests.get('https://somepath.com/dev/doc/72').json()

【讨论】:

  • 效果很好。我没有意识到它是 JSON(没有文档......)。并非一切都那么清楚。一百万谢谢。
  • 如今,JSON 作为一种基于 HTTP 的 API 的数据格式已经相当普遍,因此不用提及它就被使用是很正常的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多