You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重复使用同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:43:35