2015-05-05 69 views
0

我有幾個HTML文件,其內容是這樣的:根據標籤修改html文件?

<html> 
    <header> 
     <title>A test</title> 
    </header> 
    <body> 
     <table> 
      <tr> 
       <td id="MenuTD" style="vertical-align: top;"> 
        Stuff here <a>with a link</a> 
        <p>Or paragraph tags</p> 
        <div>Or a DIV</div> 
       </td> 
       <td>Another TD element, without the MenuTD id</td> 
      </tr> 
     </table> 
     <div> 
      <link rel="stylesheet" href="\d\d\d\d_files/zannotationtargettoggle.css" type="text/css"> 
     </div> 
    </body> 
</html> 

其中\d是一個數字的佔位符,以及確切的數字的文件有不同。

我想寫一個Python程序到每個HTML文件轉換爲以下形式:

<html> 
    <header> 
     <title>A test</title> 
    </header> 
    <body> 
     <link rel="stylesheet" href="\d\d\d\d_files/zannotationtargettoggle.css" type="text/css"> 
     <td id="MenuTD" style="vertical-align: top;"> 
      Stuff here <a>with a link</a> 
      <p>Or paragraph tags</p> 
      <div>Or a DIV</div> 
     </td> 
    </body> 
</html> 

具體來說,

  1. 我們怎樣才能提取鑑於頭標記<header>...</header><link rel="stylesheet" href="\d\d\d\d_files/zannotationtargettoggle.css" type="text/css">,他們沒有ID?

  2. 如果身體標籤具有屬性例如<body style="margin-left: 6px; cursor: default;" onload="InitBody();">...</body>,我們應該如何首先清空其內容...裏面的開始和結束標記,然後在裏面加上<link rel="stylesheet" href="\d\d\d\d_files/zannotationtargettoggle.css" type="text/css">menu_td的內容?

謝謝!

+1

使用某些HTML解析器喜歡[Beautiful Soup](http://www.crummy.com/software/BeautifulSoup/) – nu11p01n73R

+0

Whi您使用的是HTML解析庫嗎?你所要求的一切都是可行的,但每個圖書館都有不同的做法。 – abarnert

+0

另外,您的HTML無效。在'html'的頂層只能使用0或1'head's和''body'; 'header'是一個進入體內的標籤(通常包裹一個'h1'或類似的東西)。 (另外,它僅限於HTML5,並且您沒有'doctype'聲明,這意味着您的文件是HTML3。) – abarnert

回答

2

您可以使用BeautifulSoup修改輸入文件:

import bs4 

doc = bs4.BeautifulSoup(s) # s your input html 
td = doc.find('td') 
doc.find('table').replace_with(doc.find('link')) 
doc.find('div').replace_with(td) 

測試所得到的文檔:

>>> print str(doc) 
<html> 
<body><header> 
<title>A test</title> 
</header> 
<link href="\d\d\d\d_files/zannotationtargettoggle.css" rel="stylesheet" type="text/css"/> 
<td id="MenuTD" style="vertical-align: top;"> 
        Stuff here <a>with a link</a> 
<p>Or paragraph tags</p> 
<div>Or a DIV</div> 
</td> 
</body></html> 

,或者你可以建立一個新的文件:

doc = bs4.BeautifulSoup(s) 
doc2 = bs4.BeautifulSoup('<html />') 
doc2.html.append(doc.header) 
doc2.html.append(doc2.new_tag('body')) 
doc2.body.append(doc.link) 
doc2.body.append(doc.find('td')) 
+0

謝謝。要刪除的部分很複雜,不僅僅是'table'和'div'(我簡化了這個例子)。鑑於哪部分被保留,是否有一些方法可以刪除零件? – Tim

+0

@Tim:去閱讀BeautifulSoup介紹文檔,JuniorCompressor爲您鏈接。在你理解之前,你不會理解他給你的任何代碼。一旦你這樣做了,你可能會自己編寫代碼。 (或者,如果不是的話,你會有一個更具體的問題,而不僅僅是「爲我寫代碼」。) – abarnert

+0

@Tim as abarnert說最好閱讀文檔。 BeautifulSoup是一個非常有用的工具,我無法在如此一般的條件下提供特定的解決方案。 – JuniorCompressor