【问题标题】:How can I scrape a website with invalid HTML [duplicate]如何使用无效的 HTML 抓取网站 [重复]
【发布时间】:2010-10-08 18:41:48
【问题描述】:

我正在尝试从包含无效 HTML 的网站中抓取数据。 Simple HTML DOM Parser 解析它,但由于它如何处理无效的 HTML 而丢失了一些信息。带有 DOMXPath 的内置 DOM 解析器不起作用,它返回一个空白结果集。在通过 PHP Tidy 运行获取的 HTML 后,我能够让它(DOMDocument 和 DOMXPath)在本地工作,但是 PHP Tidy 没有安装在服务器上并且它是一个共享托管服务器,所以我无法控制它。我试过HTMLPurifier,但这似乎只是为了保护用户输入,因为它完全删除了文档类型、头部和正文标签。

有没有 PHP Tidy 的独立替代品?我真的更喜欢使用 DOMXPath 来导航并获取我需要的东西,它似乎需要一些帮助来清理 HTML,然后才能解析它。

编辑:我正在抓取这个网站:http://courseschedules.njit.edu/index.aspx?semester=2010f。现在我只是想获取所有课程链接。

【问题讨论】:

  • 你在抓取什么网站?
  • 那个帖子实际上有我需要的东西。 PHPQuery 完成了这项工作。

标签: php web-scraping


【解决方案1】:

如果您使用 loadHTMLloadHTMLFile,DOM 可以很好地处理损坏的 HTML:

$dom = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom->loadHTMLFile('http://courseschedules.njit.edu/index.aspx?semester=2010f');
libxml_clear_errors();

$xPath = new DOMXPath($dom);
$links = $xPath->query('//div[@class="courseList_section"]//a');
foreach($links as $link) {
    printf("%s (%s)\n", $link->nodeValue, $link->getAttribute('href'));
}

会输出

ACCT - Accounting (index.aspx?semester=2010f&subjectID=ACCT)
AD   - Art and Design (index.aspx?semester=2010f&subjectID=AD  )
ARCH - Architecture (index.aspx?semester=2010f&subjectID=ARCH)
... many more ...
TRAN - Transportation Engr (index.aspx?semester=2010f&subjectID=TRAN)
TUTR - Tutoring (index.aspx?semester=2010f&subjectID=TUTR)
URB  - Urban Systems (index.aspx?semester=2010f&subjectID=URB )

使用

echo $dom->saveXML($link), PHP_EOL;

foreach 循环中将输出完整的outerHTML 链接。

【讨论】:

  • 这比简单的 HTML DOM Parser 稍微好一点,但是如果计算结果,它只给出了 123 个链接中的 107 个。
  • @Telanor 已更新。 XPath 现在搜索 div 内的所有带有 courseList_section 类的链接,而不是 div 内的 spans 内的所有链接。我很确定你自己可以很容易地解决这个问题。也可以'//a[ancestor::div[@class="courseList_section"]]'
  • 你说得对,它现在可以工作了。我仍然不确定我是如何没有尝试过的。这实际上是我在运行 Tidy 后在本地使用的 XPath 查询
【解决方案2】:

如果您知道错误,您可能会应用一些正则表达式来专门修复它们。虽然这种临时解决方案可能看起来很脏,但实际上它可能更好,因为如果 HTML 确实格式不正确,自动推断正确的解释可能很复杂。

编辑:实际上,最好通过正则表达式简单地提取所需的信息,因为页面有很多错误,这些错误很难或至少是乏味的。

【讨论】:

  • -1。它看起来很脏,因为它很难维护。
【解决方案3】:

是否有可以通过 Tidy 运行您的内容的网络服务?你能写一个吗? Tidy 是我所知道的修复损坏标记的唯一明智的方法。

【讨论】:

    【解决方案4】:

    解决问题的另一种简单方法是通过移动浏览器适配器包传递您尝试抓取的网站,例如谷歌针对复杂网站的动员程序。这将更正无效的 html 并使您能够使用简单的 html dom 解析器包,但如果您需要从站点中删除的某些信息,它可能无法工作。该适配器的链接如下。我将它用于信息格式不正确的网站,或者如果我需要一种方法来简化格式以便于解析。 google mobilizer 返回的 html 更简单,也更容易处理。

    http://www.google.com/gwt/n

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 2021-01-21
      • 1970-01-01
      • 2012-03-09
      • 2012-09-29
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2021-12-04
      相关资源
      最近更新 更多