【问题标题】:An approach to address html contents in a python class一种在 python 类中处理 html 内容的方法
【发布时间】:2012-12-26 13:20:07
【问题描述】:

我正在处理一些 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, ...]

我考虑这个的原因是我正在使用BeautifulSoup API,我非常赞同他们在生成的“汤”上处理每个标签的方式。

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

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

【问题讨论】:

    标签: python user-interface user-friendly


    【解决方案1】:

    如果您使用类属性 (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']
    

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

    【讨论】:

    • 我会采纳你的建议的!感谢您的帖子!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多