如何从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 文件中提取和读取 [重复]

如何从C#中的URL读取WCF服务的WSDL

在C++中如何读取文本中的数据存储为数组变量?

如何在 Python 3 中从磁盘读取和编辑列表?

将 .csv 文件从 URL 读取到 Python 3.x - _csv.Error:迭代器应返回字符串,而不是字节(您是不是以文本模式打开文件?)