我正在使用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
<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
<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>
答案 0 :(得分:0)
有不同的方法可以做到这一点。我还没有找到一个真正让我满意的HTMLParser,但我还在寻找!以下是一些想法:
只需计算找到starttag <td>
的次数,然后接受数据处理程序中的数据
稍微改进的版本:计数具有属性<td>
class='resultLabel'
还是稍微好一些:搜索嵌套 <td>
s
如果要检测页面中的多个字段,可以实现state machine
,以检测特定的标记序列。
您还可以获取所有标记并构建树结构,这样您就可以直接处理您期望<td>
所在的分支。
这就是lxml的作用:在一个步骤中,它解析HTML文档并将其转换为树结构,然后可以将其导航到包含所需<td>
的分支。
主要问题是什么?许多网站都会生成不正确的网页。因此,解析器必须具有容错能力并接受某些陌生感。大多数浏览器都会悄悄地接受这种陌生感,但您可以使用浏览器的调试器进行检查,或将URL发送到w3c的验证服务。