我需要在 Python 中做一件看似简单的事情,结果却非常复杂。我需要做的是:
- 打开一个 HTML 文件。
- 匹配特定 HTML 元素的所有实例,例如
table
. - 对于每个实例,将元素提取为字符串,将该字符串传递给将进行一些修改的外部命令,最后用从外部命令返回的新字符串替换原始元素。
我不能简单地做 a re.sub()
,因为在每种情况下替换字符串都是不同的并且基于原始字符串。
有什么建议么?
你可以使用Beautiful Soup来做到这一点。
尽管对于您的需要,像lxml.etree这样更简单的东西可以正常工作。
听起来你想要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
编辑:更新到最终解决方案。
我发现通过 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>