Python基础爬虫无法从文本文件读取URL输入问题求助
解决从文本文件读取URL给urllib.request.urlopen时的AttributeError问题
嘿,我来帮你搞定这个问题!你遇到的AttributeError本质是个小疏忽——urllib.request.urlopen()需要的是字符串格式的URL地址,但你直接把open()返回的文件对象(也就是那个_io.TextIOWrapper)传进去了,这个对象根本没有urlopen要找的type属性,所以才会报错。
先看看你原来的错误信息,就是因为这个原因:
Traceback (most recent call last):
File "scrape.py", line 8, in
data = urllib.request.urlopen(url).read()
File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.6/urllib/request.py", line 518, in open
protocol = req.type
AttributeError: '_io.TextIOWrapper' object has no attribute 'type'
下面是修复后的代码,我还做了一些实用优化:
import re import urllib.request # 读取文件中的URL:打开文件后要读取内容,还要清理多余的换行/空格 with open('input.txt', 'r') as url_file: # 读取第一行并去除首尾空白(包括换行符),确保URL是干净的字符串 url = url_file.readline().strip() # 现在url是合法的字符串URL,可以正常传给urlopen了 data = urllib.request.urlopen(url).read() data1 = data.decode("utf8") print(data1) # 用with语句写入文件,自动关闭,更安全 with open('output.txt' , 'w') as output_file: output_file.write(data1)
几个需要注意的关键点:
- 一定要从文件对象里读取内容(用
read()/readline()),不能直接把文件对象传给urlopen strip()很重要!文本文件里的URL后面大概率会有换行符\n,直接用的话会导致URL无效,这个方法能帮你去掉首尾的空白字符- 推荐用
with语句操作文件,它会在代码块结束后自动关闭文件,比手动调用close()更靠谱,避免资源泄漏
如果你的input.txt里有多行URL,可以这样批量处理:
import re import urllib.request with open('input.txt', 'r') as url_file: # 过滤空行,把每行的URL都清理干净 urls = [line.strip() for line in url_file if line.strip()] for url in urls: try: data = urllib.request.urlopen(url).read() data1 = data.decode("utf8") print(f"成功爬取 {url}") # 可以把每个URL的内容写到不同文件,或者追加到同一个文件 with open(f'{url.split("//")[-1].split("/")[0]}_output.txt' , 'w') as output_file: output_file.write(data1) except Exception as e: print(f"爬取 {url} 失败: {str(e)}")
内容的提问来源于stack exchange,提问作者Anil Arelli
相关产品推荐
相关产品推荐

