我正在使用HTMLParser从简单的html文本中提取图像网址,如下所示:
html = <p><span style="font-size: 17px;"><span style="color: #993300;"><img style="margin-right: 15px; vertical-align: top;" src="images/announcements.png" alt="announcements" /><cite>some message I would like to preserve with its formatting</cite></span></span></p>
现在我还需要一个没有img标签的上述html版本,但是在正确的位置关闭标签时遇到了困难。这是我试过的:
class MyHtmlParser(HTMLParser):
'''
Parse simple url to extract data and image url.
This is expecting a simple url containing only one data block and one iimage url.
'''
def __init__(self):
HTMLParser.__init__(self)
self.noImgHtml = ''
def handle_starttag(self, tag, attrs):
if tag == 'img':
for a in attrs:
if a[0] == 'src':
self.imageUrl = a[1]
else:
print '<%s>' % tag
self.noImgHtml += '<%s>' % tag
for a in attrs:
print '%s=%s' % a
self.noImgHtml += '%s=%s' % a
def handle_endtag(self, tag):
self.noImgHtml += '</%s>' % tag
def handle_data(self, data):
self.noImgHtml += data
MyHtmlParser()。feed(html)的输出是:
<b>LATEST NEWS:</b><p><span>style=font-size: 17px;<span>style=color: #993300;</img><cite>The image uploader works again, so make sure to use some screenshots in your uploads/tutorials to make your submission look extra nice</cite></span></span></p>
正如您所看到的(并且正如我的代码流程所预期的那样),标签不会像原始html那样关闭(例如span&gt;)。
这可以通过HTMLParser轻松完成,还是应该使用RE来提取图像标记(看起来不是很优雅)?
我无法使用外部模块执行此操作,因此需要使用HTMLParser提供的功能。
提前致谢, 坦率
答案 0 :(得分:0)
事实上,您的代码正常运行,您可以使用
parser = MyHtmlParser()
parser.feed(html)
parser.noImgHtml
真的是你想要的。我试过了,输出是
<p><span>style=font-size: 17px;<span>style=color: #993300;</img><cite>some message I would like to preserve with its formatting</cite></span></span></p>
除了您需要将handle_endtag
功能更改为
def handle_endtag(self, tag):
if tag != 'img'
self.noImgHtml += '</%s>' % tag
排除img
的结束标签。
实际上MyHtmlParser().feed(html)
只有print
结果,它什么都不返回。原因
如果print
endtag
以及handle_endtag
和handle_data
中的代码内容没有{{1}},则打印输出中的代码未正确关闭。
如果您正在尝试处理嵌套的div,Alex在这里回答可能会有所帮助。 How can I use the python HTMLParser library to extract data from a specific div tag?
答案 1 :(得分:0)
HTMLParser.get_starttag_text()似乎是重建原始html的票证。这似乎有效:
class MyHtmlParser(HTMLParser):
'''
Parse simple url to extract data and image url.
This is expecting a simple url containing only one data block and one iimage url.
'''
def __init__(self):
HTMLParser.__init__(self)
self.noImgHtml = ''
def handle_starttag(self, tag, attrs):
if tag == 'img':
for a in attrs:
if a[0] == 'src':
self.imageUrl = a[1]
else:
self.noImgHtml += self.get_starttag_text()
def handle_endtag(self, tag):
if tag != 'img':
self.noImgHtml += '</%s>' % tag
def handle_data(self, data):
self.noImgHtml += data
self.text = data