在 Win7 x64 上使用 Python 3.2。我有一个脚本,我想在每次启动 IDLE 时运行它。这是我的脚本:
import sys
from bs4 import BeautifulSoup
sys.setrecursionlimit(2000)
soup = BeautifulSoup()
def soupSetup(file_name, encode_type):
soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))
这样一切就绪,我所要做的就是传递 soupSetup()
我想使用的 html 文件,我可以开始处理数据。
我的问题是 - 如果我在使用 print(soup.prettify())
时按原样使用代码除了一个空行,我没有得到任何返回。如果我在运行 print 语句时不首先实例化类,我会得到:
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
print(soup.prettify())
NameError: name 'soup' is not defined
对于那些不熟悉 BeautifulSoup 的人,汤是 <class 'bs4.BeautifulSoup'>
的一个实例.
如何让 soup 对象在我的脚本之外持久存在?
最佳答案
您使用语句 soup = BeautifulSoup()
创建了一个模块全局名称 soup
。然后,在函数 soupSetup
中,您想要将 soup
名称重新分配给另一个 BeautifulSoup()
对象,这次使用数据。
但是:函数内的名称是该函数的局部名称,不会在该函数外保留。所以你最终没有重新分配全局 soup
名称,而是在函数内部创建一个新的单独的 soup
变量,然后在函数存在时将其删除。全局 soup
没有被改变。这就是为什么您在使用 soup
变量时得到您首先创建的空 BeatifulSoup() 对象的原因。
您需要做的是告诉函数您要重新分配全局名称,如下所示:
def soupSetup(file_name, encode_type):
global soup
soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))
应该可以了。
此外,您不必设置 soup = BeautifulSoup()
,设置什么并不重要,因为它会被函数覆盖。只需这样做:
soup = None
完整的代码最终应该是这样的:
import sys
from bs4 import BeautifulSoup
sys.setrecursionlimit(2000)
soup = None
def soupSetup(file_name, encode_type):
global soup
soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))
关于python - 使用脚本在 IDLE 中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13756941/