我是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)
有人能帮助我吗?
答案 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
方法中)传入变量。当我们收集数据时,我们会在id
为somename1
时打开此布尔值并将其关闭。不是很漂亮,不是吗?