我需要在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