重复使用同一urlopen对象创建BeautifulSoup,为何第二个实例输出为空?
问题解答
第一段代码里bsObj3为空的原因
urlopen()返回的是类文件对象,这类对象有个特点:读取内容时内部的指针会跟着移动。第一次用这个html对象创建bsObj2时,BeautifulSoup已经把里面的所有内容都读完了,指针直接跑到了内容末尾。第二次再用同一个html对象创建bsObj3,自然读不到任何内容,所以输出为空。
第二段代码返回True的原因
第二段代码在创建bsObj3之前,重新调用了urlopen(url),相当于重新拿了一个全新的类文件对象,这个新对象的指针在起始位置,能被BeautifulSoup正常读取解析,所以bsObj2和bsObj3的内容完全一致,比较结果就是True。
修复第一段代码的小技巧
要是想复用同一份请求内容,先把响应内容读取成字符串存起来,再用这个字符串创建多个BeautifulSoup对象就行:
from urllib.request import urlopen from urllib.error import HTTPError from bs4 import BeautifulSoup url = 'https://www.pythonscraping.com/pages/warandpeace.html' html = urlopen(url) # 提前把响应内容读取为字符串 html_content = html.read() bsObj2 = BeautifulSoup(html_content, "html.parser") bsObj3 = BeautifulSoup(html_content, "html.parser") print(bsObj3) # 这下输出就正常了
内容的提问来源于stack exchange,提问作者popoman
相关产品推荐
相关产品推荐

