【问题标题】:Remove text from first cell HTML using python使用python从第一个单元格HTML中删除文本
【发布时间】:2014-03-10 14:47:10
【问题描述】:

我有这个文件:

    <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

【问题讨论】:

标签: python html regex html-parsing


【解决方案1】:

使用正则表达式解析 HTML 是一种非常糟糕的做法(请参阅评论中的@Lutz Horn 链接)。

改用 HTML 解析器。例如,以下是如何使用 BeautifulSoup 将第一个 td 标记的值设置为空:

Beautiful Soup 是一个 Python 库,用于从 HTML 和 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>

另见:

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    使用正则表达式解析 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] 表示以任意顺序匹配/td 中的任何一个一个。请注意我是如何使用.* 来匹配任意字符串,后跟/td
    • re.sub() 的最后一个可选参数是一个标志参数。 re.DOTALL 允许 . 匹配新行。
    • ? 表示执行非贪婪搜索,因此它只会消耗一个单元格。
    • re.sub() 返回结果字符串,它不会就地修改字符串。

    【讨论】:

    • 特别感谢 @Rob 为您的 cmets!
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多