python - urllib.request.urlopen TypeError:需要一个类似字节的对象,而不是'str'
问题描述
我究竟做错了什么?
from urllib import request
def get_page(page):
page = request.urlopen(page).read()
return page
def get_next_target(page):
start_link = page.find("<a href=")
if(start_link == -1):
return None
start_quote = page.find('"', start_link)
end_quote = page.find('"', start_quote+1)
url = page[start_quote+1:end_quote]
print(url)
return(url,end_quote)
def print_all_links(page):
while True:
url, endpos = get_next_target(page)
if url:
print(url)
page = page[endpos:]
else:
break
page = get_page('https://xkcd.com/')
print(page)
get_next_target(page)
#print_all_links(page)
错误是
Traceback (most recent call last):
File "./xkcdscrape.py", line 29, in <module>
get_next_target(page)
File "./xkcdscrape.py", line 8, in get_next_target
start_link = page.find("<a href=")
TypeError: a bytes-like object is required, not 'str'
解决方案
read的返回类型是bytes
. 在您的get_page
函数调用中decode将字节转换为字符串。
def get_page(page):
page = request.urlopen(page).read()
return page.decode('utf-8')
您可以在此处阅读有关使用urllib
获取 Internet 资源的更多信息。但是requests为此类任务提供了更简单的接口。
使用Beautiful Soup之类的库进行网络抓取也更简单。
推荐阅读
- html - SVG圆形动画问题
- windows - 如何在 Windows 8.1 上下载 BASH
- excel - Excel中范围的地址
- python - 从 PySerial 读取/转换类似字节的十六进制对象
- javascript - 多个 Deferred 对象被传递给 jQuery.when 问题
- javascript - 如何从javascript中的url中提取多个令牌?
- powerbi-embedded - PowerBI Embedded:来自 wabi-north-europe-redirect.analysis.windows.net/explore/explorations/.../cache 的 401(未经授权)
- javascript - 通过 JavaScript 检测手机的使用情况
- laravel - 处理查询时的 Laravel 分号问题
- bokeh - 如何使用套索选择存储数据点并将它们存储在python中?