如何从python 3中的url读取html
Posted
技术标签:
【中文标题】如何从python 3中的url读取html【英文标题】:How to read html from a url in python 3 【发布时间】:2014-07-31 22:55:55 【问题描述】:我查看了以前的类似问题,但更加困惑。
在 python 3.4 中,我想读取一个 html 页面作为字符串,给定 url。
在 perl 中,我使用 LWP::Simple 执行此操作,使用 get()。
一个 matplotlib 1.3.1 示例说:import urllib; u1=urllib.urlretrieve(url)
。
python3找不到urlretrieve
。
我尝试了u1 = urllib.request.urlopen(url)
,它似乎得到了一个HTTPResponse
对象,但我无法打印它或获取它的长度或索引它。
u1.body
不存在。我在 python3 中找不到HTTPResponse
的描述。
HTTPResponse
对象中是否有一个属性可以为我提供 html 页面的原始字节?
(与其他问题无关的内容包括urllib2
,它在我的python、csv 解析器等中不存在)
编辑:
我在之前的问题中发现了部分(大部分)起作用的东西:
u2 = urllib.request.urlopen('http://finance.yahoo.com/q?s=aapl&ql=1')
for lines in u2.readlines():
print (lines)
我说“部分”是因为我不想阅读单独的行,而只想阅读一个大字符串。
我可以将这些行连接起来,但是打印的每一行都在前面加上一个字符“b”。
这是从哪里来的?
再一次,我想我可以在连接之前删除第一个字符,但这确实是个笨蛋。
【问题讨论】:
这是 Python 3 文档中对HTTPResponse
objects 的描述。
【参考方案1】:
请注意,Python3 不会将 html 代码读取为字符串,而是将其读取为bytearray
,因此您需要将其转换为带有decode
的代码。
import urllib.request
fp = urllib.request.urlopen("http://www.python.org")
mybytes = fp.read()
mystr = mybytes.decode("utf8")
fp.close()
print(mystr)
【讨论】:
fp
对象有 readlines()
方法,至少在 Python 版本 3.6.1 中。
假设它的 UTF-8 编码不是一个好主意。您应该尝试阅读标题
我无法将 mystr 写入文本文件。每次运行程序时都会出现此错误:return codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap' codec can't encode characters in position 369774-369777: character maps to <undefined>
【参考方案2】:
试试 'requests' 模块,它更简单。
#pip install requests for installation
import requests
url = 'https://www.google.com/'
r = requests.get(url)
r.text
更多信息在这里>http://docs.python-requests.org/en/master/
【讨论】:
import requests
是 Python 2,不是吗?
什么意思? py3 中也使用了 import libname
来自网站:“Requests 正式支持 Python 2.7 和 3.6+,并且在 PyPy 上运行良好。”【参考方案3】:
urllib.request.urlopen(url).read()
应该将原始 HTML 页面作为字符串返回给您。
【讨论】:
@user1067305 奇怪...request.urlopen()
returns an HTTPResponse
和they do have read()
方法...
好的!我这样试过:u2 = urllib.request.urlopen('finance.yahoo.com/q?s=aapl&ql=1') junk = u2.read() print(junk)【参考方案4】:
import requests
url = requests.get("http://yahoo.com")
htmltext = url.text
print(htmltext)
这将类似于urllib.urlopen
。
【讨论】:
【参考方案5】:使用 urllib 读取 html 页面非常简单。既然你想把它当作一个字符串来读,我会告诉你的。
导入 urllib.request:
#!/usr/bin/python3.5
import urllib.request
准备我们的请求
request = urllib.request.Request('http://www.w3schools.com')
在请求网页时始终使用“try/except”,因为很容易出错。 urlopen() 请求页面。
try:
response = urllib.request.urlopen(request)
except:
print("something wrong")
Type 是一个很棒的函数,它可以告诉我们变量是什么“类型”。这里的 response 是一个 http.response 对象。
print(type(response))
我们的响应对象的读取函数会将 html 作为字节存储到我们的变量中。 type() 将再次验证这一点。
htmlBytes = response.read()
print(type(htmlBytes))
现在我们对 bytes 变量使用 decode 函数来获取单个字符串。
htmlStr = htmlBytes.decode("utf8")
print(type(htmlStr))
如果您确实想将此字符串拆分为单独的行,您可以使用 split() 函数来实现。在这种形式中,我们可以轻松地遍历以打印出整个页面或进行任何其他处理。
htmlSplit = htmlStr.split('\n')
print(type(htmlSplit))
for line in htmlSplit:
print(line)
希望这能提供更详细的答案。 Python 文档和教程很棒,我会将其用作参考,因为它可以回答您可能遇到的大多数问题。
【讨论】:
假设它的 UTF-8 编码不是一个好主意。您应该尝试阅读标题 @CpILL 不错。我同意,虽然 utf-8 被广泛使用,但您可能会遇到问题。【参考方案6】:对于python 2
import urllib
some_url = 'https://docs.python.org/2/library/urllib.html'
filehandle = urllib.urlopen(some_url)
print filehandle.read()
【讨论】:
可以指定它是用于 Python2 的吗?正如我检查的那样,urllib.urlopen
不存在 Python3。以上是关于如何从python 3中的url读取html的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Python cv2、scikit 图像和 mahotas 中的 Internet URL 读取图像?
从 Python3 中的 .zip 文件中提取和读取 [重复]
将 .csv 文件从 URL 读取到 Python 3.x - _csv.Error:迭代器应返回字符串,而不是字节(您是不是以文本模式打开文件?)