一种在python类中处理html内容的方法

2024-04-27 03:13:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一些html解析,我很难定义一种方法来处理被提取的信息。你知道吗

例如,考虑这样一个页面http://www.the-numbers.com/movies/1999/FIGHT.php。我想处理每一个内容,比如The Numbers RatingRotten TomatoesProduction BudgetTheatrical 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, ...]

我之所以考虑这样做,是因为我正在使用BeautifulSoupAPI,而且我非常熟悉它们处理结果“soup”上每个标记的方式。你知道吗

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

你认为哪种方式更方便用户?有没有更好的办法?你知道吗


Tags: 方法self内容data过程defclasskey2
2条回答

如果使用类属性(自动键1…)静态检查代码的工具(如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 lost)

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

因此,如果您不需要在已创建的“键”列表中迭代,我将使用class属性方式。你知道吗

如果你有固定数量的属性,也就是说,你事先知道键值,那么我认为更好的方法是把这些键中的每一个作为实例变量,就像你的第二个例子一样。你知道吗

另一方面,如果您不知道您将事先拥有哪些“键”,或者它们太多,那么您可以使用类似字典的容器类型。您可以动态地将数据添加到字典中,因此如果有许多数据,也会减轻负担。例如,您可以使用“For…”。。。在..“循环中添加数据。你知道吗

相关问题 更多 >