解析<span>标记并使用python </span>获取数据

时间:2011-12-07 10:09:57

标签: python html parsing

我是stackoverflow的新手,这是我的第一个问题。

我正在用Python编写脚本来解析HTML页面。 页面如下所示:

<TABLE style="border: 1px solid black">

<TR>
    <TD colspan="2"><span id="text1" style="color: white">DATA1</span></TD>
</TR>
<TR>    
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename1" class="alsoname">DATA2</span></TD>
</TR>   
<TR>    
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename2" class="alsoname">DATA3</span></TD>
</TR>                                               
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename3" class="alsoname">DATA4</span></TD>
</TR>
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename4" class="alsoname">DATA5</span></TD>
</TR>
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename5" class="alsoname">DATA6</span></TD>
</TR>                                               
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename6" class="alsoname">DATA7</span></TD>
</TR>
<TR>
    <TD class="rowLabel" valign="top">Data name</TD>
    <TD valign="top" width="100"><span id="somename7" class="alsoname">DATA8</span></TD>
</TR>                           

我想根据span id名称从括号中收集DATA值。 如果span ID == somename1,则将其DATA值放在变量中。

到目前为止,我有这段代码:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag == 'span':
            for name, value in attrs:
                if name == 'id' and value == 'somename1':
                    print 'ID', value
                elif name == 'id' and value == 'somename2':
                    print 'ID', value
                elif name == 'id' and value == 'somename3':
                    print 'ID', value
                else :
                    print 'NO DATA'

p = MyHTMLParser()
p.feed(flush)  

有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

我发现使用BeautifulSoup和任何类型的HTML都要容易得多。

from BeautifulSoup import BeautifulSoup as bs
from urllib2 import urlopen

data = urlopen('wherever').read()

soup = bs(data)

for span in soup.findAll('span'):
    print span['id'], span.text

您可能需要优化它的某些部分,因为您只提供了一个表格。

答案 1 :(得分:0)

覆盖handle_starttag方法是不够的。不幸的是,在我看来,基本HTMLParser并不完全...... 可用,也许你看看BeautifulSoup。你可以这样做:

class MyHTMLParser(HTMLParser):
    def __init__(self):
        self.collect_data = False
        self.tagname = None
        self.id = None

    def handle_starttag(self, tag, attrs):
        if tag == 'span':
            for name, value in attrs:
                if name == 'id' and value == 'somename1':
                    self.collect_data = True
                    self.tagname = tag
                    self.id = value

    def handle_data(self, data):
        if self.collect_data:
            self.somevar = data
            self.collect_data = False

            print "Tag: %s ID: %s" % (self.tagname, self.id)
            print "Data: %s" % data

使用collect_data我们声明我们要将下一个数据(在handle_data方法中)传入变量。当我们收集数据时,我们会在idsomename1时打开此布尔值并将其关闭。不是很漂亮,不是吗?