我有这个文件:
<table>
<tr>
<td WIDTH="49%">
<p><a href="...1.htm"> cell to remove</a></p></td>
<td WIDTH="51%"> some text </td>
</tr>
我需要这样的结果:
<table>
<tr>
<td>
</td>
<td WIDTH="51%"> some text </td>
</tr>
我正在尝试使用此html读取文件并将第一个标记替换为空标记:
ret = open('rec1.txt').read()
re.sub('<td[^/td>]+>','<td> </td>',ret, 1)
final= open('rec2.txt', 'w')
final.write(ret)
final.close()
正如你所看到的,我是使用python的新东西,当我读到rec2.txt时,它包含与前一个文件完全相同的文本。
TKS
答案 0 :(得分:4)
使用正则表达式解析HTML是一种非常糟糕的做法(请参阅评论中的@Lutz Horn链接)。
改为使用HTML解析器。例如,以下是使用BeautifulSoup将第一个td
代码的值设置为空的方法:
Beautiful Soup是一个用于从HTML和HTML中提取数据的Python库 XML文件。它适用于您最喜欢的解析器,以提供惯用语 导航,搜索和修改解析树的方法。它 通常可以节省程序员数小时或数天的工作量。
from bs4 import BeautifulSoup
data = """
<table>
<tr>
<td WIDTH="49%">
<p><a href="...1.htm"> cell to remove</a></p>
</td>
<td WIDTH="51%">
some text
</td>
</tr>
</table>"""
soup = BeautifulSoup(data, 'html.parser')
cell = soup.table.tr.td
cell.string = ''
cell.attrs = {}
print soup.prettify(formatter='html')
打印:
<table>
<tr>
<td>
</td>
<td width="51%">
some text
</td>
</tr>
</table>
另见:
希望有所帮助。
答案 1 :(得分:1)
使用正则表达式解析HTML是一种非常糟糕的做法。如果您实际上是在尝试修改HTML,请使用HTML解析器。
如果问题是学术问题,或者您只是试图进行问题中描述的有限转换,那么这是一个正则表达式程序:
#!/usr/bin/python
import re
ret = open('rec1.txt').read()
ret = re.sub('<td.*?/td>','<td> </td>',ret, 1, re.DOTALL)
final= open('rec2.txt', 'w')
final.write(ret)
final.close()
注意:
[/td]
表示以任意顺序匹配/
,t
或d
的任何一个。请注意我是如何使用.*
匹配任意字符串后跟/td
。re.sub()
的最终可选参数是flags参数。 re.DOTALL
允许.
匹配新行。?
表示执行非贪婪搜索,因此只会使用一个单元格。re.sub()
返回结果字符串,它不会修改字符串。