首页 > 解决方案 > 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'

标签: pythonpython-3.xurllib

解决方案


read的返回类型是bytes. 在您的get_page函数调用中decode将字节转换为字符串。

def get_page(page):
    page = request.urlopen(page).read()
    return page.decode('utf-8')

您可以在此处阅读有关使用urllib获取 Internet 资源的更多信息。但是requests为此类任务提供了更简单的接口。

使用Beautiful Soup之类的库进行网络抓取也更简单。


推荐阅读