0

这是 html 文件的一部分。

......
......
<tr>
<td color="white" style="color:black; bgcolor="#ffff00">Adam</th>
<td color="white" style="color:white; bgcolor="#ff9900">450231</th>
<td color="white" style="color:black; bgcolor="#cc0000">658902</th>
</tr>
.......
.......
<tr>
<td color="white" style="color:black; bgcolor="#ffff00">John</th>
<td color="white" style="color:white; bgcolor="#ff9900">8734658</th>
<td color="white" style="color:black; bgcolor="#cc0000">90865</th>
</tr>
.......
.......

如果bgcolor="#ff9900",我需要提取 450231 和 8734658 并将它们放入列表中

到目前为止,我已经做到了这一点..

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.recording = 0
        self.data = []

    def handle_starttag(self, tag, attrs):
        if tag == 'td':
            for name, value in attrs:
                if name == 'bgcolor' and value == '#993399':
                    self.recording = 1 

    def handle_endtag(self,tag):
        if tag == 'th':
            self.recording -= 1

    def handle_data(self, data):
        if self.recording:
            self.data.append(data)
.
.
.
        y = urllib2.urlopen(x)   # x gets the html file
        html = y.read()
        parser = MyHTMLParser()
        parser.feed(html)
        print parser.data
        parser.close()

parser.data 包含['\n', 'Adam', '\n', '450231', '\n', '658902\n', '\n', '\n', '\n'....]什么时候应该只包含['450231', '8734658']我不确定我哪里出错了。

4

1 回答 1

0

您的录制标志似乎始终处于打开状态,除非在初始化时。您可能需要在适当的时候将其重置为零。由于为所有标签设置了标志,因此您将始终获得附加在列表中的数据。这主要是因为 HTML 中不存在您的“th”标签。首先更正 HTML。

编辑:只需阅读 HTML 不在您的控制范围内。我不确定“th”结束标记中的检查是否会成功。尝试在 endtag 中打印标签。如果它不是 th,那么控制永远不会到达那里。如何使用正则表达式来匹配它。如果美丽的汤无法解析它,您可能需要求助于正则表达式。


pattern = '<td.*?bgcolor="#ff9900".*?>(.*?)</th>'
re.findall(pattern, html) 

应该给你结果。

于 2013-06-21T18:48:04.463 回答