使用Python和Beautiful Soup读取TXT批量抓取多网页数据报错求助
解决URL循环抓取时的"unknown url type"错误
嘿,我一眼就发现你代码里的问题啦!你现在的问题出在读取URL文件的方式不对,导致循环的时候拿到的不是完整的URL,而是单个字符,这才触发了那个奇怪的错误。
错误原因分析
你用了urls = f.read(),这会把整个urls.txt文件的内容一次性读成一个大字符串。然后for url in urls会逐个遍历这个字符串里的每个字符——比如你的URL是https://example.com,循环时会先拿到h,再拿到t,以此类推。把单个字符传给urlopen,它当然识别不出这是合法的URL类型,自然就报错了。
修正后的代码
你需要按行读取文件里的URL,有两种简单的方式:
方式1:遍历文件对象本身(推荐)
文件对象本身就是可迭代的,直接循环它就能逐行读取:
from urllib2 import urlopen from bs4 import BeautifulSoup as soup with open('urls.txt', 'r') as f: # 逐行读取文件,自动处理换行 for url in f: # 去掉每行末尾的换行符和前后空白(比如空行的情况) clean_url = url.strip() # 跳过空行,避免处理无效内容 if not clean_url: continue try: uClient = urlopen(clean_url) page_html = uClient.read() uClient.close() page_soup = soup(page_html, "html.parser") # 这里写你的表格抓取逻辑 print(f"成功处理URL: {clean_url}") except Exception as e: print(f"处理URL {clean_url} 时出错: {str(e)}")
方式2:用readlines()读取所有行
这种方式会把所有行读到一个列表里,再循环列表:
from urllib2 import urlopen from bs4 import BeautifulSoup as soup with open('urls.txt', 'r') as f: # 读取所有行,返回列表 urls = f.readlines() for url in urls: clean_url = url.strip() if not clean_url: continue try: uClient = urlopen(clean_url) page_html = uClient.read() uClient.close() page_soup = soup(page_html, "html.parser") # 表格抓取逻辑 print(f"成功处理URL: {clean_url}") except Exception as e: print(f"处理URL {clean_url} 时出错: {str(e)}")
额外注意事项
- 一定要用
strip()处理每行的内容,因为文件里的每行末尾都会有换行符\n,直接传给urlopen也会导致URL无效。 - 添加
try-except块可以捕获单个URL处理失败的情况,不会因为某一个URL出错就导致整个程序崩溃。 - 如果你的
urls.txt里有空白行,记得用if not clean_url: continue跳过,避免处理空字符串。
内容的提问来源于stack exchange,提问作者Kristen Funk
相关产品推荐
相关产品推荐

