2012-04-18 33 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> 
相關問題