我必须解析一系列网页才能将数据导入应用程序。每种类型的网页都提供相同类型的数据。问题是每个页面的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$
等。但是,它将是一个工作繁重。你能想到更简单的解决方案吗?任何可以提供帮助的图书馆?
由于
答案 0 :(得分:8)
您可以通过整理来传递页面的来源以获得有效页面。你可以找到整洁的here 。 Tidy对许多编程语言都有绑定。完成此操作后,您可以使用自己喜欢的解析器/内容提取技术。
答案 1 :(得分:2)
我建议Html Agility Pack。它能够处理结构不良的HTML,同时使用Xpath为您提供Xml选择。你仍然需要模板项目或选择使用不同的选择和分析,但它会让你通过糟糕的结构驼峰。
答案 2 :(得分:2)
正如前面提到的here以及之前的其他SO答案,Beautiful Soup可以解析奇怪的HTML。
Beautiful Soup是一个Python HTML / XML解析器,专为快速周转项目而设计,例如屏幕抓取。三个功能使它变得强大:
- 如果给你不好的标记,美丽的汤不会窒息。它产生一个解析树,使其与原始文档几乎一样有意义。这通常足以收集您需要的数据并逃跑。
- Beautiful Soup提供了一些简单的方法和Pythonic习语,用于导航,搜索和修改解析树:用于剖析文档和提取所需内容的工具包。您不必为每个应用程序创建自定义解析器。
- Beautiful Soup会自动将传入的文档转换为Unicode,将传出的文档转换为UTF-8。您不必考虑编码,除非文档没有指定编码并且Beautiful Soup不能自动检测编码。然后你只需要指定原始编码。
醇>美丽的汤解析你给它的任何东西,并为你做树遍历的东西。您可以告诉它“查找所有链接”,或“查找类externalLink的所有链接”,或“查找其网址匹配的所有链接”foo.com“,或”查找具有粗体文本的表格标题,然后给出我那个文字。“
答案 3 :(得分:1)
使用像html5lib这样的HTML5解析器。
与HTML Tidy不同,这将使您能够非常接近浏览器的错误处理。
答案 4 :(得分:0)
这里有几个特定于C#的线程,如Looking for C# HTML parser。
答案 5 :(得分:0)
根据您提取正则表达式所需的数据,可能是一个选项。我知道很多人会想到在结构化数据上使用RegExes,但是很明显的事实(正如你所发现的那样)很多HTML实际上并没有很好的结构,而且很难解析。
我遇到了类似的问题,但在我的情况下,我只需要页面中的一个特定数据,这些数据很容易识别而无需解析HTML,因此RegEx工作得非常好。