0

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

  1. 打开一个 HTML 文件。
  2. 匹配特定 HTML 元素的所有实例,例如table.
  3. 对于每个实例,将元素提取为字符串,将该字符串传递给将进行一些修改的外部命令,最后用从外部命令返回的新字符串替换原始元素。

我不能简单地做 a re.sub(),因为在每种情况下替换字符串都是不同的并且基于原始字符串。

有什么建议么?

4

3 回答 3

1

你可以使用Beautiful Soup来做到这一点。

尽管对于您的需要,像lxml.etree这样更简单的东西可以正常工作。

于 2012-04-18T16:52:48.737 回答
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

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

于 2012-04-18T16:54:03.690 回答
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>
于 2012-04-18T19:49:43.453 回答