我正在处理一些html解析,我很难定义一种方法来处理被提取的信息。
例如,考虑如下页面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
你认为哪种方式更方便用户使用?有更好的方法吗?
如果你使用类属性(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']
所以,如果你不需要在你已经创建的"键"列表中迭代,我会使用类属性的方式。
如果你有固定数量的属性,即:你事先知道键值,那么我认为更好的方法是将每个键都作为实例变量,就像你的第二个例子一样。
另一方面,如果事先不知道有哪些"键",或者有太多"键",则可以使用字典之类的容器类型。您可以动态地向字典中添加数据,因此如果有很多数据,也会减少负担。例如,你可以用For…在.."循环中添加数据。