【问题标题】:Huge HTML table - filter rows containing a string巨大的 HTML 表格 - 过滤包含字符串的行
【发布时间】:2021-04-23 18:48:04
【问题描述】:

我有如下所示的示例 HTML 文档。现在我需要使用 Profession as Engineer(column2) 过滤所有行并生成结果 HTML 文档。但这里的问题是我的文档包含 200 万行,文档大小为 1GB。任何人都可以建议一种更快的方法来处理这个吗?

我尝试使用 Python 和 BeautifulSoup 模块进行解析并尝试过滤,但处理数据需要 15 多个小时。有没有更快的方法来做到这一点?

代码:

from BeautifulSoup import BeautifulSoup
fd = open("input.html")
soup = BeautifulSoup(fd.read())
for tr in soup('tr'):
    if str(tr('td')[1].text) != "Engineer":
         tr.extract()
with open("output.html", "w") as file:
    file.write(str(soup))
fd.close()

输入:

<html>
<body>
<table>
<tr>
    <td>Name</td>
    <td>Profession</td>
    <td>Address</td>
</tr>
<tr>
    <td>John</td>
    <td>Assassin</td>
    <td>JohnWick</td>
</tr>
<tr>
    <td>Tony</td>
    <td>Engineer</td>
    <td>IronMan</td>
</tr>
<tr>
    <td>Stark</td>
    <td>Engineer</td>
    <td>IronMan</td>
</tr>
<tr>
    <td>Bruce</td>
    <td>Professor</td>
    <td>Hulk</td>
</tr>
</table>
</body>
</html>

输出:

<html>
<body>
<table>
<tr>
    <td>Name</td>
    <td>Profession</td>
    <td>Address</td>
</tr>
<tr>
    <td>Tony</td>
    <td>Engineer</td>
    <td>IronMan</td>
</tr>
<tr>
    <td>Stark</td>
    <td>Engineer</td>
    <td>IronMan</td>
</tr>
</table>
</body>
</html>

【问题讨论】:

  • 不知道,对我来说似乎是一个合理的问题!

标签: python html performance html-parsing


【解决方案1】:

您需要保留空格/格式吗?这是您需要多次执行的操作,还是一次性完成?

如果是一次性工作,您可能会做得更简单一些。尝试在 Notepad++、Sublime 等中打开它。使用查找和替换来重新格式化,这样每个表格行就有一个代码行:

<tr><td>Bruce</td><td>Professor</td><td>Hulk</td></tr>
<tr><td>Stark</td><td>Engineer</td><td>IronMan</td></tr>

(您可以不执行此步骤,但这样会更容易查看发生了什么)。

然后你可以找到并替换为:

<tr>.*?<td>Professor</td>.*?</tr>

有一个空白行(对每个非工程师角色重复)。如果有很多职业,您可以使用反向引用来更改工程师行

<tr> content </tr>

<tr-keep> content </tr>

然后查找并替换所有原版 tr 行。

您也可以在 Excel 中打开它并以这种方式过滤。我相信这里也有一些很好的 Python 解决方案,只是告诉你我会怎么做——我在 Python 中处理大文件时遇到过类似的问题,你可以在基本文本或电子表格中处理大量数据编辑。 Excel 早餐吃了一百万行。

【讨论】:

  • 非常感谢@penitent_tangent。这个简单的想法真的很有帮助。虽然我无法在 excel 或 notepad++ 崩溃时做到这一点,但我能够在 vim 编辑器中应用这个想法并在 5 分钟内达到预期的结果。这个想法真的很有帮助。谢谢。
  • 虽然这已经解决了我的问题,但如果有感兴趣的用户也会提出程序化方法,我会继续公开这篇文章。
猜你喜欢
  • 2023-03-25
  • 2014-05-16
  • 1970-01-01
  • 2019-02-21
  • 2020-06-14
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多