【问题标题】:How to parse a large malformed HTML page, in Python?如何在 Python 中解析大型格式错误的 HTML 页面?
【发布时间】:2015-10-07 04:21:57
【问题描述】:

我正在尝试使用格式错误的表格标记解析大型 HTML 页面。 表中有大约 7000-10000 行。 问题是trthtd 都没有关闭。所以,标记是这样的:

<HTML>
<HEAD>
</HEAD>
<BODY>

<center>

    <table border = 1>
        <tr height=40><th colspan = 16><font size=4>Dummy content
        <tr><th>A
            <th>B
            <th>C
            <th>D
            <th>E
            <th>F
            <th>G


        <tr><td>A
            <td>B
            <td>C
            <td>D
            <td>E
        <tr><td>A
            <td>B
            <td>C
            <td>D
            <td>E
    .........
    .........

    </table>
    </center>
    </BODY>
    </HTML>

我尝试BeautifulSoup.prettify() 修复它,但 BeautifulSoup 遇到最大递归深度错误。也试过用lxml,如下:

from lxml import html
root = html.fromstring(htmltext)
print len(root.find('.//tr'))

但它返回的长度约为 50,其中实际上有超过 7000 个tr

有没有很好的方法来解析 HTML 并为每一行提取内容?

【问题讨论】:

  • 我可以建议正则表达式吗?
  • 输入是否真的像那样,或者您是否重新格式化了它?您可以尝试将所有&lt;tr&gt; 替换为&lt;/tr&gt;&lt;tr&gt;,将所有&lt;th&gt; 替换为&lt;\th&gt;&lt;th&gt;,等等……这肯定会减少错误的数量。
  • @omri_saadon 你能推荐一个简单的示例代码吗?
  • @3-14159265358979323846264 我只更改了 A、B、C 等标签内的内容。输入的结构完全一样。
  • @rahules 你需要提取什么数据?请给我一个具体的例子

标签: python html beautifulsoup html-parsing lxml.html


【解决方案1】:

我建议尝试 HTMLParser 模块。我刚刚编写了一些使用它的代码,但我无法测试我的“除了 HTMLParser.HTMLParseError”块,因为我无法设计会使解析器失败的输入!

【讨论】:

    【解决方案2】:

    我希望你正在寻找这样的东西。

    import re
    trs = re.findall(r'(?<=<tr>).*?(?=<tr>)', your_string, re.DOTALL)
    print trs
    

    这个正则表达式将返回两个 tr 标签之间的所有内容。如果您想在其他两个标签之间进行搜索,只需将第一个 tr 和第二个 tr 更改为您需要的内容即可。

    我做了一个小测试,它对我有用,如果它对你有帮助,请告诉我。

    【讨论】:

    • 搜索结果返回无。 pastebin.com/24MjA3af 这是一个用于示例标记的粘贴箱。是的,我正在寻找在两个 tr 之间提取东西
    • @rahules 我编辑了代码,试试这个,请告诉我
    猜你喜欢
    • 2010-10-28
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多