使用脚本在IDLE中设置变量

时间:2012-12-07 04:31:26

标签: python python-3.x beautifulsoup python-idle

在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'>的一个实例。

如何使汤对象在我的脚本之外保持不变?

2 个答案:

答案 0 :(得分:0)

使用语句soup创建模块的全局名称soup = BeautifulSoup()。然后,在函数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))

答案 1 :(得分:-1)

一个看起来像两个问题。

关于在启动时执行的代码的第一个问题是通过根据http://docs.python.org/dev/library/site.html在某个目录中创建模块usercustomize / sitecustomize来解决的。

现在第二个问题可以通过增加__builtin__

来解决
import __builtin__
setattr(__builtin__, 'soup', soup)

在启动模块(在适当的地方)然后汤将在其他地方神奇地可用。我不建议这样做,你可能需要重新思考你想要实现的目标。此外,在您当前的方法中,您在soup内重新定义soupSetup。因此,在该函数中,您需要指定要重新定义全局变量而不是创建本地变量:

def soupSetup(...):
    global soup
    ...