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

时间:2010-10-08 18:41:49

标签: php web-scraping

我正在尝试从包含无效HTML的网站中抓取数据。 Simple 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。现在我只想尝试所有的课程链接。

5 个答案:

答案 0 :(得分:6)

如果您使用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;
<{1}}循环中的

将输出完整的foreach个链接。

答案 1 :(得分:0)

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

编辑:实际上,通过正则表达式简单地提取所需信息可能会更好,因为页面有许多错误,这些错误很难或至少很难修复。

答案 2 :(得分:0)

是否有通过Tidy运行您的内容的网络服务?你能写一个吗? Tidy是我知道修复破坏标记的唯一理智方式。

答案 3 :(得分:0)

考虑使用真实的浏览器或webbrowser控件。我使用iMacros进行了测试,web scraping效果很好。测试前两个链接的宏:

VERSION BUILD=7050962
URL GOTO=http://courseschedules.njit.edu/index.aspx?semester=2010f
'Get text
'TAG POS=2 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=TXT
'Get link first entry
TAG POS=2 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=HREF
'Get link second entry
TAG POS=3 TYPE=A FORM=ID:form1 ATTR=TXT:*-* EXTRACT=HREF

您可以通过递增POS =值来在条目之间移动。

答案 4 :(得分:0)

解决问题的另一个简单方法可能是通过您尝试通过移动浏览器适配器软件包(例如谷歌的动员者)来复制网站。这将纠正无效的html并使您能够使用简单的html dom解析器包,但如果您需要从站点中删除的某些信息,它可能无法正常工作。这个适配器的链接如下。我将此用于信息格式不佳的网站,或者我需要一种简化格式的方法,以便于解析。谷歌动员者返回的html更简单,更容易处理。

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