0

我正在处理一些 html 解析,并且我很难定义一种方法来处理所提取的信息。

例如,考虑这样的页面http://www.the-numbers.com/movies/1999/FIGHT.php。我想处理每个内容,例如The Numbers Rating, Rotten Tomatoes, Production Budget,Theatrical Release和其他内容,以便我存储每个“键”可能假设的值。

提取过程为我解决了,我不确定存储这些内容的正确方法。正如我所说,它们就像“钥匙”一样工作,所以 adictionary是一个非常直接的答案。我仍然很想在我正在构建的类中为每个“键”添加一个成员。

问题是在访问这些内容期间,考虑到代码编写,哪种方法效果更好,以及这些方法是否是最好的方法。

对于第一种情况,我会有类似的情况:

class Data:

    def __init__(self):
        self.data = dict()

    def adding_data(self):
        self.data["key1"] = (val1, val2)
        self.data["key2"] = val3
        self.data["key3"] = [val4, val5, val6, ...]

对于第二个:

class Data:

    def adding_data(self):
        self.key1 = (val1, val2)
        self.key2 = val3
        self.key3 = [val4, val5, val6, ...]

我考虑这个的原因是我正在使用BeautifulSoupAPI,而且我非常喜欢他们在生成的“汤”上处理每个标签的方式。

soup = BeautifulSoup(data)
soup.div
soup.h2
soup.b

您认为哪种方式更人性化?有没有更好的方法来做到这一点?

4

2 回答 2

0

如果您有固定数量的属性,即。您事先知道键值,那么我认为更好的方法是将这些键中的每一个都作为实例变量,就像在您的第二个示例中一样。

另一方面,如果您事先不知道您将拥有哪些“键”或者它们太多,那么您可以使用像字典这样的容器类型。您可以动态地将数据添加到字典中,因此如果它们很多,它也会减少负担。例如,您可以使用“for ... in ..”循环来添加数据。

于 2012-12-26T14:00:41.097 回答
0

如果您使用类属性(self.key1 ...),静态检查代码的工具(如 pylint)将向您显示未使用和未定义的变量,因此会显示mistypes

class toy(object):
    pass

a = toy()
a.key1 = "hello world"
print a.key10

皮林特运行:

> pylint toto.py
************* Module toto
C:  1,0: Black listed name "toto"
C:  1,0: Missing docstring
C:  1,0:toy: Invalid name "toy" (should match [A-Z_][a-zA-Z0-9]+$)
C:  1,0:toy: Missing docstring
W:  5,0: Attribute 'key1' defined outside __init__
R:  1,0:toy: Too few public methods (0/2)
C:  4,0: Invalid name "a" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
E:  6,6: Instance of 'toy' has no 'key10' member

字典中的键不会出现这种情况。输入错误会消失,这就是我更喜欢类属性的原因。但是,如果您有字典,则可以轻松地遍历键集。虽然您还可以获取类实例的属性列表,但您会在其中得到一些干扰。(请参阅 key1 在默认定义的其他属性中丢失)

>>> class toy(object):
...     pass
... 
>>> a = toy()
>>> a.key1 = "hello world"
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'key1']

因此,如果您不需要在您创建的“键”列表中进行迭代,我会使用类属性方式。

于 2012-12-26T14:02:27.687 回答