1

如何使用 C# 修复格式错误的 HTML?一个很好的答案是 HTML Agility Pack 示例!


我正在抓取一个网站(用于合法使用)。该站点的 HTML 还可以,但存在一些烦人的问题。

我可以采用的一种方法是通过正则表达式。我使用 Expression Web 来分析问题以及纠正问题所需的正则表达式。因此,一种方法是使用RegexBuddy等工具为这些正则表达式生成 C# 代码。

但是,在 C# 中处理格式错误的 HTML 的推荐工具是HTML Agility Pack (HAP)。而且,我只分析了几页,怕以后的页面会包含我还没有解决的模式,我讨厌进入“在接下来的几页中查找错误并更正它们”维护商业。因此,如果 HAP 已经有一个可靠的、始终有效的解决方案,那就太好了。问题是,除了在 SO 中提到的一些内容外,除了逐个对象的 API 帮助文件外,我找不到任何该工具的使用方法文档。

所以 - 在我花费 $ 和学习时间在 RegexBuddy(没有免费评估版)上,或者在 HAP 的 API 文档上大吃一惊之前 - 有没有一种简单的方法可以做到这一点?HAP 样本会有所帮助... :-)

4

5 回答 5

2

你能告诉我你遇到了什么烦人的问题吗?
但是您不需要使用正则表达式来清理 html,HAP 将允许您使用 Xpath 查询访问格式错误的 html 的元素。
基本上你需要学习 Xpath 才能知道如何获取你想要的 html 元素。
这实际上取决于您使用 HAP 解析的 html 类型。
但是有几种方法可以获取元素。
就像通过 id 或 class 一样,甚至您可以获取跟随另一个包含给定文本(例如“name:”)的元素的元素。
你可以去W3 学校 Xpath 教程 获取一个不错的 xpath 教程

于 2009-11-23T14:26:41.123 回答
2

我从这里的答案中得到了什么:1)如果您正在抓取一个您无法控制的网站,您将始终进入维护模式,每次您抓取的页面布局发生变化时,您都必须修复您的抓取器. 2)如果你仅限于这个已知的站点,为什么不写你的刮板来调整问题

所以,如果我必须进入维护模式,它应该尽可能简单。因此,我的流程如下:

  1. 我使用Webius 的 SWExplorerAutomation来检测网页中的场景。这个想法是场景是您为 IE 定义的条件的集合。加载网页时,IE 会尝试查看满足哪些条件(例如 - 页面标题是“帐户登录”,页面包含“登录”文本框和“密码”文本框)。如果检测到场景对应的一组条件,则IE报告已检测到场景。该模型提供了一个抽象层——网页中的一些更改可以转化为场景文件中的更改,从而使代码免于更改。此外,这使我免受 IE 的事件驱动模型的影响:我称之为“场景”。我正在评估这个产品,但我还不确定我是否会使用它,主要是因为文档很糟糕。,我还没有购买 SWEA 的另一个原因是这篇文章指责其作者向 Watin 发送垃圾邮件。
  2. 获取网页后,我使用 Expression Web 运行兼容性检查并识别错误。
  3. 我使用RegexMagic来删除和纠正错误。我真的很喜欢这个工具。当然,有时它会让你非常生气,因为它不允许你做应该很容易的事情,但它是一个甜蜜、甜蜜的工具,而且文档令人惊叹。
  4. 最后,在我知道的所有错误都得到纠正后,我使用 HTML Agility Pack 转换为 XHTML - 跨 ts 并点 is,可以这么说:全部小写,跨属性引号,等等。

希望这可以帮助!

阿维

于 2009-12-26T22:43:45.017 回答
1

正则表达式不能用于 HTML 清理。http://tidy.sourceforge.net/有帮助吗?

于 2009-11-18T08:51:35.807 回答
1

如果您正在抓取您无法控制的网站,您将始终进入维护模式,每次您正在抓取的页面布局发生变化时,您都必须修复您的抓取器。无论您是使用正则表达式 <td color="red">\d+</td> 从页面获取大红色数字,还是使用 DOM 解析器获取第三个单元格,都没有关系表中的第 2 行与 id 编号相同。如果网站管理员将颜色属性替换为类属性,则正则表达式会中断。如果网站管理员在表格顶部添加另一行,则 DOM 解析器会中断。

如果您正在抓取网页的较大部分并希望将它们嵌入到您自己的网页中,则可能更容易克服您对网络标准合规性的渴望,只需让浏览器弄清楚如何显示内容即可。

于 2009-11-23T14:09:53.900 回答
1

既然您正在使用 Html Agility Pack 并且知道发生的问题,如果您仅限于这个已知站点,为什么不编写您的爬虫来调整加载 HtmlDocument 时出现的问题。

即:如果你知道元素总是出现在 之后,将元素插入标签的第一个子位置.....

于 2009-11-23T14:13:19.277 回答