我需要在Python中做一个看似简单的事情,事实证明这很复杂。我需要做的是:如何迭代HTML文件中的特定元素并替换它们?
- 打开一个HTML文件。
- 匹配特定HTML元素的所有实例,例如
table
。 - 对于每个实例,将该元素作为字符串提取,将该字符串传递给外部命令,该外部命令将进行一些修改,最后用从外部命令返回的新字符串替换原始元素。
我不能简单地做一个re.sub()
,因为在每种情况下,替换字符串是不同的,并基于原始字符串。
有什么建议吗?
我需要在Python中做一个看似简单的事情,事实证明这很复杂。我需要做的是:如何迭代HTML文件中的特定元素并替换它们?
table
。我不能简单地做一个re.sub()
,因为在每种情况下,替换字符串是不同的,并基于原始字符串。
有什么建议吗?
听起来像是你想要的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
编辑:更新到最终解决。
您可以使用Beautiful Soup来做到这一点。
虽然为了您的需要,像lxml.etree这样简单的东西可以正常工作。
我发现通过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>
试过了,但它不是那么简单不幸的是,除非我得到它错了。字符串属性只有在元素包含字符串时才有效,而表格在其下面有更多标记。所以table.string返回“None”。 – Radek 2012-04-18 17:04:40
我的不好。你需要['contents'](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#contents-and-children)属性。 – mklauber 2012-04-18 17:10:29
干杯!最后,这是什么工作: '从BS4进口BeautifulSoup 汤= BeautifulSoup(html_doc) 表= soup.find_all( '表') 为表表: 内容= STR(table.contents ) new_contents =变换(内容) table.replaceWith(new_contents) ' – Radek 2012-04-19 08:51:28