3

在 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'>.

如何使汤对象在我的脚本之外持续存在?

4

2 回答 2

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))
于 2012-12-07T05:18:18.153 回答
-1

两个问题合二为一。

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

现在第二个问题可以通过扩充来解决__builtin__

import __builtin__
setattr(__builtin__, 'soup', soup)

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

def soupSetup(...):
    global soup
    ...
于 2012-12-07T12:35:19.840 回答