AttributeError:' bytes'对象没有属性'超时'

时间:2014-06-04 23:16:28

标签: python

import re, urllib.request

textfile = open('depth_1.txt','wt')
print('enter the url you would like to crawl')
print('Usage - "http://phocks.org/stumble/creepy/" <-- with the double quotes')
my_url = input()
for i in re.findall(b'''href=["'](.[^"']+)["']''', urllib.request.urlopen(my_url).read(), re.I):
    print(i)
    for ee in re.findall(b'''href=["'](.[^"']+)["']''', urllib.request.urlopen(i).read(), re.I): #this is line 20!
        print(ee)
        textfile.write(ee+'\n')
textfile.close()

在寻找解决问题的方法之后,我找不到修复方法。第20行出现错误(AttributeError:&#39; bytes&#39;对象没有属性&#39;超时&#39;)。我不完全理解这个错误,所以我正在寻找答案并解释我做错了什么。谢谢!

3 个答案:

答案 0 :(得分:4)

来自urllib.request.urlopen的{​​{3}}:

urllib.request.urlopen(url[, data][, timeout])

    Open the URL url, which can be either a string or a Request object.

如果urllib.request.urlopen没有收到字符串,则认为它是一个Request对象。你正在传递一个字节串,这就是它失败的原因,例如:

>>> a = urllib.request.urlopen('http://www.google.com').read() # success
>>> a = urllib.request.urlopen(b'http://www.google.com').read() # throws same error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 153, in urlopen
    return opener.open(url, data, timeout)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/urllib/request.py", line 446, in open
    req.timeout = timeout
AttributeError: 'bytes' object has no attribute 'timeout'

要解决此问题,请使用适当的编解码器将字节串转换回str:

>>> a = urllib.request.urlopen(b'http://www.google.com'.decode('ASCII')).read()

或者首先不要使用字节串。

答案 1 :(得分:2)

此错误是由于您无法将字节字符串用作网址,请检查程序的编码

答案 2 :(得分:1)

因为它是属性错误,所以您编写的或您使用的库中的某些代码尝试访问传递的对象的超时属性。在你的情况下你传递了一个字节对象,这可能是你的问题。您可能会在某处传递错误的对象类型。如果您确定要传递的对象是正确的,请按照回溯查看确切调用超时的位置,并检查是否可以告诉它预期的对象。