【问题标题】:Clean HTML using C#使用 C# 清理 HTML
【发布时间】:2009-11-18 07:44:38
【问题描述】:

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


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

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

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

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

【问题讨论】:

  • 不确定您在这里真正想要做什么。 HtmlAgilityPack 用于从可能不一致的 HTML 中获取一致的对象模型;它并不是真正用于“修复”它。
  • @AakashM:网页显示正确,但兼容性测试失败,即使是 HTML 4.01 过渡等非限制性测试。我想要的是修改 HTML,使其显示相同但符合要求。
  • 我有一个问题。如果您使用 Save() 方法保存 HtmlDocument。不会是从错误中修复的 html 吗?我没有尝试过,只是想知道是否会这样做:)
  • @Karim - 感谢您的提示。是的,但在我检查过的特定页面中,我更愿意以不同的方式实施一些更正。

标签: html screen-scraping html-agility-pack malformed


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    希望这会有所帮助!

    视频

    【讨论】:

    • 我刚刚去维基百科寻找有关 WatiN 的信息。页面显示:(en.wikipedia.org/wiki/WatiN) "20:27, 17 August 2008 Alexf (talk | contribs) deleted "WatiN" ‎ (A7 (web): Web content which doesn't指示其重要性或意义)" Alex Furman who是 SWExplorerAutomation 工具的创建者。真希望这两个不是同一个人!
    • 抱歉,无法编辑英文错误:“I've just going to Wikipedia”、“There is an Alex Furman who is”。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您正在抓取一个不受您控制的网站,您将始终进入维护模式,每次您抓取的页面布局发生变化时,您都必须修复您的抓取器。无论您是使用正则表达式

      \d+ 从页面获取大红色数字,还是使用 DOM 解析器获取第三个单元格,都没有关系表中的第 2 行与 id 编号相同。如果网站管理员将颜色属性替换为类属性,则正则表达式会中断。如果网站管理员在表格顶部添加另一行,则 DOM 解析器会中断。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-11-05
          • 2010-10-20
          • 2012-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-22
          • 2015-01-09
          相关资源
          最近更新 更多