【问题标题】:Why doesn't .find() work with urllib.request.urlopen() in python 3?为什么 .find() 在 python 3 中不能与 urllib.request.urlopen() 一起使用?
【发布时间】:2012-05-02 04:38:02
【问题描述】:

尝试从 python 2 中的 urllib 转换到 python 3。我可以使用 .urlopen() 输出 html 源代码,但无法使用 .find() 方法对其进行索引。

import urllib.request
fh = urllib.request.urlopen("http://stackoverflow.com")
html = fh.read()
fh.close()

print(html.find("<p>"))

我收到类型错误。我知道它正在返回一个字节数组,但我对它的实际含义很模糊。我已经尝试了一些 SO 答案like this,这些都是死胡同。我的问题是:

在 python 3 中是否有一种直接的本地方法可以将 URL 的页面源作为字符串获取?

【问题讨论】:

  • 你为什么不用美汤?

标签: python python-3.x


【解决方案1】:

使用html.decode('utf-8')(或任何编码)来获得一个str 对象,您可以在该对象上使用.find()

.decode() 用于获取一组平面字节并将它们(通过反转字符编码,例如 UTF-8)转换为一串实际代码点(可显示的符号)。

【讨论】:

  • “不管它是什么编码”是我的问题。为什么我必须指定编码?这不是包含在文档本身中吗?
  • “有时。”并非所有服务器都发送 Content-Encoding 标头(并非您使用urlopen() 获取的所有内容都是文本)。无论哪种方式,urlopen() 都不会处理它们,它只是将原始结果作为类似文件的对象(没有与之关联的编码数据)提供给您。
  • 但是,我也赞同 Ignacio 的评论 - 使用 BeautifulSoup 之类的库可以解决您的大部分问题,而且它是进行 HTML 解析的更好方法。
  • 毫无疑问。我一直在尝试学习 python,我想我已经专注于将 html 作为字符串检索的问题,甚至还没有考虑过解析。我没有意识到这一步是不必要的。
猜你喜欢
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2021-06-14
  • 2012-10-09
  • 2020-03-18
相关资源
最近更新 更多