2015-05-05 46 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