【问题标题】:Python: How can add words to a list?Python:如何将单词添加到列表中?
【发布时间】:2012-05-09 06:14:49
【问题描述】:

好的,标题有点模糊,但我想做的是在线下载数据,解析它,然后将解析的“数据”放入一个 excel 文件中。

我一直在尝试将数据放入向量或列表中。请注意,数据可以是单词或数字。另外,我的数据长度是未知的。我尝试了以下代码:

class MyHTMLParser(HTMLParser):
    def handle_data(self, data):
        d=[]
        d=d.append(data)

parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

d

Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
d
NameError: name 'd' is not defined

我环顾论坛寻找答案,但似乎没有遇到任何问题。我是初学者,所以我可能缺少一些基本的东西吗?谢谢你的帮助...

【问题讨论】:

  • "我将 html 部分的 更改为 ()" 请不要那样做。只需正确格式化代码即可。
  • 仅供参考list.append() 返回None。所以,你在MyHTMLParser中将None分配给d

标签: python string list html-parsing append


【解决方案1】:

类方法内部,需要使用self来引用成员变量。

从这样的开始可能更有意义:

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.d = []
    def handle_data(self, data):
        self.d.append(data)

然后,要访问d,您需要指定类实例,例如

parser.d

编辑:global 会起作用,但除非有令人信服的理由,否则我认为您应该学习如何以正确的方式做事,而不是弄乱全局命名空间

【讨论】:

  • 你确定这段代码运行成功了吗?恕我直言,您的 init ctor 不正确,缺少行:HTMLParser.__init__(self)
  • @mloskot:这完全正确,我没有注意到它正在继承另一个类。我现在就编辑它
  • 在我开始发帖之前,我没有看到所有列出的 cmets...所以请忽略。谢谢。
  • 您好,首先感谢您的帮助!但似乎还是有什么不对劲。 >>> class MyHTMLParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.d = [] def handle_data(self, data): self.d.append(data) >>> parser = MyHTMLParser( ) >>> parser.feed(' 测试' '

    解析我!

    ') >>> parser.d [] - d 似乎还是空的。
  • 我也尝试删除 self.d = [] 行,但随后我得到 Traceback(最近一次调用最后):文件“”,第 1 行,在 解析器中.d AttributeError: MyHTMLParser 实例没有属性 'd'
【解决方案2】:

您的代码存在三个问题。

  • 每次调用该方法时都会创建一个新的空列表。
  • list.append 返回 None(不是列表),因此您现在包含一个元素的列表实际上并未存储在任何地方。
  • 分配给函数内的变量会创建一个 local 变量,而不是 global 变量(除非您使用 global 关键字指定该变量应该是全局变量) .

试试这个:

d = []

class MyHTMLParser(HTMLParser):
    def handle_data(self, data):
        d.append(data)

使用全局变量也是一种不好的风格。您可能需要考虑将d 设为该类的属性,并给它一个更好的名称。

【讨论】:

  • 嘿,谢谢。这很好用!但是问题是,使用全局变量有什么不好?在我把所有的编码都正确之后,我会给它一个更好的名字。
【解决方案3】:

这是你要找的吗?

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    data = []
    def get_data(self):
        return self.data
    def handle_starttag(self, tag, attrs):
        pass
    def handle_endtag(self, tag):
        pass
    def handle_data(self, data):
        self.data.append(data)


# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')
print 'All data', parser.get_data()

输出:

All data ['Test', 'Parse me!']

【讨论】:

  • 嘿,谢谢,这似乎是我想做的。 Mark Byer 的回答也是正确的,所以我首先看到了它并接受了它。感谢您的帮助。
【解决方案4】:

如果要在模块范围内绑定名称,则需要在函数开头使用global。

【讨论】:

    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2011-07-27
    • 1970-01-01
    • 2019-02-10
    • 2016-08-09
    相关资源
    最近更新 更多