python:找到html标签并替换它们的属性

时间:2013-10-14 09:47:27

标签: python html parsing tags

我需要做以下事情:

  1. 采取html文件
  2. 查找'img'标签
  3. 的每一次出现
  4. 采用他们的'src'属性
  5. 将已建立的网址传递给处理
  6. 将'src'属性更改为新属性
  7. 使用Python 2.7完成所有这些工作
  8. P.S。我听说过lmxl和BeautifulSoup。你怎么建议解决这个问题?也许最好使用正则表达式呢?还是别的什么?

4 个答案:

答案 0 :(得分:5)

使用lxml

import lxml.html as LH
root = LH.fromstring(html_string)
for el in root.iter('img'):
    el.attrib['src'] = 'new src'
print(LH.tostring(root, pretty_print=True))

使用正则表达式is generally a bad idea解析HTML。 使用像BeautifulSoup或lxml.html这样的HTML解析器是个更好的主意。

使用BeautifulSoup的一个吸引力在于它具有熟悉的Python界面。导航功能有很多:find_allfind_nextfind_previousfind_parentfind_next_siblings等。

支持BeautifulSoup的另一个观点是,当lxml不能时,BeautifulSoup有时可以解析破坏的HTML(例如,通过插入缺少的结束标记)。 lxml更严格,如果HTML格式不正确,则会引发异常。

与BeautifulSoup API提供的众多功能相比,lxml主要使用XPath迷你语言进行导航。使用XPath进行导航往往比使用BeautifulSoup的等效导航更简洁。问题是你必须learn XPathlxml is also much much faster than BeautifulSoup.

因此,如果您刚刚开始,BeautifulSoup可能更容易立即使用,但最后我相信lxml更适合使用。

答案 1 :(得分:4)

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html_string)
for link in soup.findAll('a')
    link['src'] = 'New src'
html_string = str(soup)

我不是特别喜欢BeautifulSoup,但它可以帮到你。如果你不需要,尽量不要过度使用你的解决方案,这是解决一般问题所能做的最简单的事情之一。

这种悲伤,为未来而建立同样重要,但所有6个要求都可以归为一个,“我想改变'src'或所有链接到X”

答案 2 :(得分:1)

以下是lxml方法:

import lxml.html

filename = 'your_html_filename.html'
document = lxml.html.parse(filename)
tag = 'your_tag_name'
elements = document.xpath('//{}'.format(tag))

for e in elements:
    e.attrib['src'] = 'new value'

result = str(document)

对于您的特定问题,使用BSlxml没有确切的优势。这只会在你的问题背景下发挥作用。

答案 3 :(得分:1)

如果您想使用正则表达式,只需将此答案放在那里:

html = """
<!doctype html>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js"></script>
</body>
</html>
"""

import re

find = re.compile(r'src="[^"]*"')

print find.sub('src="changed"', html)