如何使用无效的HTML抓取网站

Tel*_*nor 2 php web-scraping

我正在尝试从具有无效HTML的网站中抓取数据. 简单的HTML DOM Parser解析它但由于其处理无效HTML的方式而丢失了一些信息.带有DOMXPath的内置DOM解析器不起作用,它返回一个空白结果集.在通过PHP Tidy运行获取的HTML之后,我能够在本地工作(DOMDocument和DOMXPath),但是服务器上没有安装PHP Tidy,它是一个共享的托管服务器,所以我无法控制它.我尝试过HTMLPurifier,但这似乎只是为了保护用户输入,因为它完全删除了doctype,head和body标签.

PHP Tidy有什么独立替代品吗?我真的更喜欢使用DOMXPath导航并抓住我需要的东西,它似乎需要一些帮助清理HTML才能解析它.

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

Gor*_*don 6

如果您使用loadHTML或,DOM可以处理损坏的HTML loadHTMLFile:

$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'));
}
Run Code Online (Sandbox Code Playgroud)

将输出

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 )
Run Code Online (Sandbox Code Playgroud)

运用

echo $dom->saveXML($link), PHP_EOL;
Run Code Online (Sandbox Code Playgroud)

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