2012-04-18 60 views
0

我需要在Python中做一个看似简单的事情,事实证明这很复杂。我需要做的是:如何迭代HTML文件中的特定元素并替换它们?

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

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

有什么建议吗?

回答

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

编辑:更新到最终解决

+0

试过了,但它不是那么简单不幸的是,除非我得到它错了。字符串属性只有在元素包含字符串时才有效,而表格在其下面有更多标记。所以table.string返回“None”。 – Radek 2012-04-18 17:04:40

+0

我的不好。你需要['contents'](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#contents-and-children)属性。 – mklauber 2012-04-18 17:10:29

+0

干杯!最后,这是什么工作: '从BS4进口BeautifulSoup 汤= BeautifulSoup(html_doc) 表= soup.find_all( '表') 为表表: 内容= STR(table.contents ) new_contents =变换(内容) table.replaceWith(new_contents) ' – Radek 2012-04-19 08:51:28

1

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

虽然为了您的需要,像lxml.etree这样简单的东西可以正常工作。

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> 
相关问题