在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'>
的一个实例。
如何使汤对象在我的脚本之外保持不变?
答案 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
...