2012-12-26 16 views
0

我与一些HTML解析HTML应对内容,而且我具有限定的方式来解决所提取的信息相当辛苦。的办法来解决在Python类

例如,考虑一个像这样的页面http://www.the-numbers.com/movies/1999/FIGHT.php。我想要解决每个内容,例如The Numbers Rating,Rotten Tomatoes,Production Budget,Theatrical Release和其他,这样我就可以存储每个“密钥”可能承担的值。

提取过程为我解决,我不确定是否存储这些内容的正确方法。正如我所说的,他们像“钥匙”一样工作,所以dictionary是一个相当直接的答案。尽管如此,我仍然在为我正在建造的课程中的每个“关键”添加一个成员。

问题在于,在访问这些内容的过程中,考虑代码编写,哪种方法可以更好地工作,以及这些方法是否是最佳方法。

我会的,对于第一种情况,是这样的:

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, ...] 

为什么我考虑这样做的原因是,我使用BeautifulSoup API,并且我非常喜欢他们在生成的“汤”上标记每个标签的方式。

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

您认为哪种方式更加用户友好?有没有更好的方法来做到这一点?

回答

0

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

class toy(object): 
    pass 

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

pylint的运行:

> 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'] 

所以,如果你不需要在“键”列表中迭代您已经创建,我会使用类属性的方式。

+0

我会采纳您的建议!感谢帖子! – Rubens

0

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

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