代码之家  ›  专栏  ›  技术社区  ›  Hoang Pham

python如何搜索和更正HTML标记和属性?

  •  1
  • Hoang Pham  · 技术社区  · 14 年前

    我必须修复所有的结束标签 <img> 标记如下面的文本所示。而不是关闭 <IMG & GT; 用一个 > ,它应该与 /> .

    有什么简单的方法可以搜索所有 <IMG & GT; 在本文中修复 > ?

    (如果用 /gt; 这样就不需要任何操作了)。

    其他问题,如果没有“宽度”或“高度”到 <IMG & GT; 具体来说,解决问题的最佳方法是什么?

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

    正确的 <IMG & GT; 标签是与 /gt; 并具有有效的宽度和高度。

    <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">
    

    我真的需要 width height 在输出中,因为它将用作其他分析器的输入。解析器说 <img 标记必须以 /gt; . 我没有使用输出在网页上查看。请建议一个简单的解决方案来实现这一点!

    3 回复  |  直到 10 年前
        1
  •  0
  •   Tim McNamara    14 年前

    为了简单起见,我将把解析(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)
    
        2
  •  0
  •   isaaclw    10 年前

    这仍然是这个谷歌查询的主要回应,也许是因为我对这个问题的理解不够好。

    我要找的(也许还有OP要找的)是XML转储,而不是HTML转储。

    因此,为了解析并获得我需要的输出,我使用了lxml.html,如@tim mcnamara所说。

    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')
    
        3
  •  -1
  •   nils    14 年前

    嗯,<img…>是正确的HTML,<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),这可能不值得您这么做。