使用解析器替换所有IMG元素的SRC

10

我正在寻找一种不使用正则表达式的方法来替换所有IMG标签中的SRC属性。(希望使用默认Python安装中包含的任何现成的HTML解析器)我需要将源代码从任何可能的情况下减少为:

<img src="cid:imagename">

我正在尝试将所有的src标签替换为HTML电子邮件中附件的cid,因此我还需要更改源文件名,使其只是不带路径或扩展名的文件名。


1
我会推荐使用lxml,但是由于你明确表示它必须与Python一起包含,所以这只能作为注释而不是答案。 ;) - Lennart Regebro
谢谢。我不会排除其他解决方案,并感谢您的建议! - CPCase
2个回答

27

Python标准库中有一个HTML解析器,但它不是很有用,自从Python 2.6版本以来就已经被弃用。使用BeautifulSoup解析HTML非常容易:

from BeautifulSoup import BeautifulSoup
from os.path import basename, splitext
soup = BeautifulSoup(my_html_string)
for img in soup.findAll('img'):
    img['src'] = 'cid:' + splitext(basename(img['src']))[0]
my_html_string = str(soup)

感谢您提供这个示例,我非常感激! - CPCase
5
标准库中的HTMLParser没有被弃用?这是怎么来的?这里是Python 3版本的文档:http://docs.python.org/3/library/html.parser.html - simon

1
这是一个针对您问题的pyparsing方法。您需要自己编写代码来转换http src属性。
from pyparsing import *
import urllib2

imgtag = makeHTMLTags("img")[0]

page = urllib2.urlopen("http://www.yahoo.com")
html = page.read()
page.close()

# print html

def modifySrcRef(tokens):
    ret = "<img"
    for k,i in tokens.items():
        if k in ("startImg","empty"): continue
        if k.lower() == "src":
            # or do whatever with this
            i = i.upper() 
        ret += ' %s="%s"' % (k,i)
    return ret + " />"

imgtag.setParseAction(modifySrcRef)

print imgtag.transformString(html)

标签转换为:

<img src="HTTP://L.YIMG.COM/A/I/WW/BETA/Y3.GIF" title="Yahoo" height="44" width="232" alt="Yahoo!" />
<a href="r/xy"><img src="HTTP://L.YIMG.COM/A/I/WW/TBL/ALLYS.GIF" height="20" width="138" alt="All Yahoo! Services" border="0" /></a>

非常感谢您的帮助。我会尝试一下。感谢您的时间和帮助! - CPCase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接