【问题标题】:HTMLParser: Get data inside the <td> that follows another oneHTMLParser:在另一个 <td> 中获取数据
【发布时间】:2015-07-18 01:22:33
【问题描述】:

我正在使用 Python 的 HTMLParser(本身不是必需的,但出于公司环境的原因,它比外部库更好)从一个巨大的表格中提取日期,该表格来自一个开发不佳的软件,看起来像这样的摘录:

(...)
<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>

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

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

我一直在研究 HTMLParser,但我不确定如何完成这项任务...尽管由于公司规定,我真的很想坚持使用 Python 的内置插件,但请随意推荐其他库。

【问题讨论】:

  • 这个场景对我来说不是 100% 清楚,但是当你找到它时,如何将日期存储在一个变量中,然后查看下一个元素,如果它显示成功,则使用存储的日期,否则清除它?
  • 是的,这就是我想做的。这里的问题是我不知道找到所需数据的可靠方法(“成功”部分)

标签: python html-parsing html-parser


【解决方案1】:

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

  • 只需计算找到起始标签&lt;td&gt; 的次数,然后接受来自数据处理程序的数据

  • 略微改进的版本:统计具有class='resultLabel'属性的起始标签&lt;td&gt;

  • 还是好一些:搜索 nested &lt;td&gt;s

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

您还可以获取所有标签并构建一个树结构,这将允许您直接寻址您期望&lt;td&gt; 所在的分支。 这就是lxml 所做的:在一个步骤中,它解析 HTML 文档并将其转换为树结构,然后可以导航到包含您需要的 &lt;td&gt; 的分支。

主要问题是什么?很多很多网站都会生成不正确的页面。因此,由解析器决定是否具有容错性并接受某些陌生性。大多数浏览器都会默默接受这种奇怪,但您可以使用浏览器的调试器检查或将 url 发送到 w3c 的验证服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2019-05-02
    相关资源
    最近更新 更多