Python如何搜索和更正html标签和属性?

时间:2010-07-29 09:19:33

标签: python html string html-parsing

我必须修复<img>标记的所有结束标记,如下文所示。不应使用<img>关闭>,而应使用/>关闭。

有没有简单的方法可以搜索此文中的所有<img>并修复>

(如果已经使用/>关闭,则无需采取任何措施。)

其他问题,如果指定的<img>没有“宽度”或“高度”,解决问题的最佳方法是什么?

下载所有图像并获取宽度和高度的相应属性,然后将它们添加回字符串?

正确的<img>代码是以/>结束并且有效宽度&amp;高度。

<a href="http://www.cultofmac.com/daily-deals749-mac-mini-1199-3-0ghz-imac-new-mac-pros/52674"><img align="left" hspace="5" width="150" src="http://s3.dlnws.com/images/products/images/749000/749208-large" alt="" title=""></a>
Apple today unleashed a number of goodies, including giving iMacs and Mac Pros more oomph with new processors and increased storage options. We have those deals today, along with many more items for the Mac lover. Along with the refreshed line of iMacs and Mac Pros, we’ll also look at a number of software deals [...]
<p><a href="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/0/da"><img src="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/0/di" border="0" ismap></a><br>
<a href="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/1/da"><img src="http://feedads.g.doubleclick.net/~a/DL_-gOGSR1JMzKDbErt1EG3re3I/1/di" border="0" ismap></a></p><img src="http://feeds.feedburner.com/~r/cultofmac/bFow/~4/Mq5iLOaT50k" height="1" width="1">

我确实需要在输出中包含widthheight,因为它将用作其他解析器的输入。并且该解析器表示<img标记必须以/>关闭。我没有使用输出在网页上查看。请提出一个简单的解决方案来实现这一目标!

3 个答案:

答案 0 :(得分:0)

为了简单起见,我会将解析(X)HTML的潜在烦恼问题外包给专用库:

以下是lxml.html的简单示例:

import lxml.html

page = """<html>...</html>"""
page = lxml.html.document_fromstring(page)
lxml.html.tostring(page)

lxml.html有一个非常方便的模块clean,旨在删除恶意代码。它也很简单:

from lxml.html.clean import clean_html
clean_html(page)

答案 1 :(得分:0)

这仍然是这个谷歌查询的主要响应,也许是因为我不能很好地理解这个问题。

我正在寻找的(也许是OP正在寻找的)是xml转储而不是html转储。

因此,为了解析并获得我需要正确移交的输出,我使用像@Tim McNamara那样的lxml.html。

import lxml.html
# read in the file
html_obj = lxml.html.fromstring(raw_html)
# whatever other dom manipulation you need to do
lxml.html.tostring(html_obj, method='xml')

答案 2 :(得分:-1)

好吧,&lt; img ...&gt;是正确的HTML,&lt; img ... /&gt;不。不知道HTML5说的是什么,但XHTML在活着之前大多已经死了。

尽管如此,我认为最简单的事情是正则表达式:

re.sub(r"<img(.*?)(?<!/)>", lambda m: "<img%s/>" % m.groups()[0],  html_code)

对于其他事情,很难。我会解析代码,将标签添加到img节点并从ast中写入html。 http://code.google.com/p/html5lib/应该可以解析。但要有有效的身高和宽度你必须阅读图像(使用PIL)可能不值得努力。