HTMLParser:在另一个内部获取数据

时间:2015-05-07 12:50:46

标签: python html-parsing html-parser

我正在使用Python的HTMLParser(不是本身的要求,但出于公司环境原因,它比外部库更好)从一个看起来像这个摘录的糟糕开发软件的巨大表中提取日期: / p>

(...)
<tr>
    <td class='resultLabel'>
        Scan Syntax
    </td>
    <td></td>
</tr>
<tr>
    <td class='resultLabel'>Show Text</td>
    <td></td>
</tr>
<tr>
    <td class='resultLabel'>
        Snapshot
    </td>
    <td>
        05/05/15 11:25:16
        &nbsp;&nbsp;
        <span class='clickCursorRegular' title='View Transcript' onClick="viewStatusTranscript('714294386-2303', '0FB88F01-CDA1-ECFA-597C-93CA57C71910')">
        Succeeded
        </span>
    </td>
</tr>
<tr>
    <td class='resultLabel'>Snapshot OS Image</td>
    <td><span style='color:#636363;'>Not Supported</span></td>
</tr>
<tr>
    <td class='resultLabel'>Telnet/SSH Session</td>
    <td>
        04/28/15 16:11:40
        &nbsp;&nbsp;
        <span class='clickCursorRegular' title='View Transcript' onClick="viewStatusTranscript('714294386-2303', '814FE794-7982-2334-E69F-4D8EF9615011')">Failed</span>
    </td>
</tr>

我的目标是获取与快照字段相对应的日期(在本例中为“05/05/15 11:25:16”),但快照成功了。 (编辑:我的意思是以任何一种方式获取日期,但也可以通过阅读“成功”部分来了解它是否有效)

这可以从以下日期内的文本中提取。包含的表没有ID或类,但它是整个页面中唯一的表,并且行数可能会波动。 FWIW,HTML是使用请求获得的。

我一直在关注HTMLParser,但我不确定如何完成这项任务......如果可能的话,由于公司规定,我真的很想建议使用Python的内置函数。 / p>

1 个答案:

答案 0 :(得分:0)

有不同的方法可以做到这一点。我还没有找到一个真正让我满意的HTMLParser,但我还在寻找!以下是一些想法:

  • 只需计算找到starttag <td>的次数,然后接受数据处理程序中的数据

  • 稍微改进的版本:计数具有属性<td>

  • 的starttags class='resultLabel'
  • 还是稍微好一些:搜索嵌套 <td> s

  • 如果要检测页面中的多个字段,可以实现state machine,以检测特定的标记序列。

您还可以获取所有标记并构建树结构,这样您就可以直接处理您期望<td>所在的分支。 这就是lxml的作用:在一个步骤中,它解析HTML文档并将其转换为树结构,然后可以将其导航到包含所需<td>的分支。

主要问题是什么?许多网站都会生成不正确的网页。因此,解析器必须具有容错能力并接受某些陌生感。大多数浏览器都会悄悄地接受这种陌生感,但您可以使用浏览器的调试器进行检查,或将URL发送到w3c的验证服务。