5

我必须解析一系列网页才能将数据导入应用程序。每种类型的网页都提供相同类型的数据。问题是每个页面的HTML不同,所以数据的位置也不同。另一个问题是 HTML 代码的格式很差,无法使用类似 XML 的解析器。

到目前为止,我能想到的最佳策略是为每种页面定义一个模板,例如:

模板 A:

<html>
...
  <tr><td>Table column that is missing a td 
      <td> Another table column</td></tr>
  <tr><td>$data_item_1$</td>
...
</html>

模板 B:

<html>
...
  <ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr>
...
</html>

这样,我只需要一个解析器来处理所有页面,它将每个页面与其模板进行比较并检索$data_item_1$,$data_item_2$等。不过,这将是很多工作。你能想出更简单的解决方案吗?任何可以提供帮助的图书馆?

谢谢

4

6 回答 6

8

您可以通过 tidy 传递页面的源以获得有效页面。你可以在这里找到整洁 。Tidy 有很多编程语言的绑定。完成此操作后,您可以使用自己喜欢的解析器/内容提取技术。

于 2009-04-02T17:13:15.873 回答
2

我推荐Html Agility Pack。它能够处理结构不佳的 HTML,同时使用 Xpath 为您提供类似 Xml 的选择。您仍然需要模板项目或使用不同的选择和分析进行选择,但它会让您摆脱糟糕的结构驼峰。

于 2009-04-02T17:14:08.820 回答
2

正如这里和之前的其他 SO 答案所提到的, Beautiful Soup可以解析奇怪的 HTML。

Beautiful Soup 是一个 Python HTML/XML 解析器,专为屏幕抓取等快速周转项目而设计。三个功能使其功能强大:

  1. 如果你给它错误的标记,Beautiful Soup 不会窒息。它会生成一个解析树,其意义与您的原始文档大致相同。这通常足以收集您需要的数据并逃跑。
  2. Beautiful Soup 提供了一些用于导航、搜索和修改解析树的简单方法和 Pythonic 习惯用法:用于剖析文档和提取所需内容的工具包。您不必为每个应用程序创建自定义解析器。
  3. Beautiful Soup 自动将传入文档转换为 Unicode,将传出文档自动转换为 UTF-8。您不必考虑编码,除非文档未指定编码并且 Beautiful Soup 无法自动检测编码。然后你只需要指定原始编码。

Beautiful Soup 解析你给它的任何东西,并为你做树遍历的东西。您可以告诉它“查找所有链接”,或“查找类 externalLink 的所有链接”,或“查找所有 url 匹配“foo.com”的链接,或“查找带有粗体文本的表格标题,然后给出我那条短信。”

于 2009-04-02T17:21:12.267 回答
1

使用像html5lib这样的HTML5 解析器。

与 HTML Tidy 不同,这将为您提供非常接近浏览器所做的错误处理。

于 2009-04-02T18:13:20.767 回答
0

有几个 C# 特定的线程,比如寻找 C# HTML 解析器

于 2009-04-02T22:05:07.340 回答
0

根据您需要提取正则表达式的数据,可能是一种选择。我知道很多人一想到在结构化数据上使用 RegExes 就会不寒而栗,但显而易见的事实是(正如您所发现的)许多 HTML 实际上的结构并不好,而且很难解析。

我遇到了类似的问题,但在我的情况下,我只想要页面中的一个特定数据,无需解析 HTML 即可轻松识别,因此 RegEx 工作得非常好。

于 2009-04-02T22:09:20.403 回答