如何迭代HTML文件中的特定元素并替换它们?

时间:2012-04-18 16:45:55

标签: python html

我需要在Python中做一个看似简单的事情,结果证明是非常复杂的。我需要做的是:

  1. 打开HTML文件。
  2. 匹配特定HTML元素的所有实例,例如table
  3. 对于每个实例,将元素作为字符串提取,将该字符串传递给外部命令,该命令将进行一些修改,最后用外部命令返回的新字符串替换原始元素。
  4. 我不能简单地执行re.sub(),因为在每种情况下,替换字符串都是不同的并且基于原始字符串。

    有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您可以使用Beautiful Soup来执行此操作。

虽然对于你需要的东西,像lxml.etree这样简单的东西可以正常工作。

答案 1 :(得分:0)

听起来像你想要BeautifulSoup。可能,你想要做的事情如下:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc)

tables = soup.find_all( 'table' )
for table in tables:
    contents = str( table.contents )
    new_contents = transform( contents )
    table.replaceWith( new_contents )

或者,您可能正在寻找更接近soup.replace_with

的内容

编辑:已更新至最终解决方案。

答案 2 :(得分:0)

我发现通过BeautifulSoup或任何其他此类解析解析HTML变得复杂,因为您需要解析不同的页面,有时结构不正确,使用javascript操作等等。在这种情况下,最佳解决方案是直接访问浏览器DOM并修改和查询节点。你可以在像phanotomjs这样的无头浏览器中轻松实现这一点。 例如这是一个phantomjs脚本

var page = require('webpage').create();

page.content = '<html><body><table><tr><td>1</td><td>2</td></tr></table></html>';
page.evaluate(function () {
    var elems = document.getElementsByTagName('td')
    for(var i=0;i<elems.length;i++){
        elems[i].innerHTML = '!'+elems[i].innerHTML+'!';
    }
});
console.log(page.content);
phantom.exit();

它会更改所有td文本,输出为

<html><head></head><body><table><tbody><tr><td>!1!</td><td>!2!</td></tr></tbody></table></body></html>