2010-10-08 49 views
2

我试图从无效HTML网站刮取数据。 Simple HTML DOM Parser解析它,但由于它处理无效的HTML如何丢失一些信息。带有DOMXPath的内置DOM解析器不起作用,它返回一个空白结果集。我能够通过PHP Tidy运行获取的HTML后在本地工作(DOMDocument和DOMXPath),但PHP Tidy未安装在服务器及其共享托管服务器上,所以我无法控制这一点。我试过HTMLPurifier,但这似乎只是为了确保用户输入,因为它完全删除了doctype,head和body标签。如何使用无效HTML刮掉网站

是否有任何种类的独立替代PHP Tidy?我真的更喜欢使用DOMXPath浏览并获取我需要的东西,它似乎需要一些帮助清理HTML,然后才能解析它。

编辑:我刮这个网站:http://courseschedules.njit.edu/index.aspx?semester=2010f。现在我只是试图获得所有的课程链接。

+0

什么网站你刮? – Stephen 2010-10-08 18:48:29

+0

[解析HTML的最佳方法]的可能重复(http:// stackoverflow。com/questions/3577641/best-methods-to-parse-html) – Gordon 2010-10-08 21:29:34

+2

这篇文章实际上有我需要的。 PHPQuery完成了这项工作。 – Telanor 2010-10-08 23:55:12

回答

6

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) 

foreach回路将输出使用

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

充分outerHTML链接。

+0

这比Simple DOM DOM Parser稍微好一些,但如果您计算结果,它只会给出123个链接中的107个。 – Telanor 2010-10-08 23:33:43

+0

@Telanor更新。 XPath现在搜索* div class中的所有链接,而类名为courseList_section *,而不是* divs *内跨度内的所有链接。我很确定你可以很容易地解决这个问题。还有可能''// a [ancestor :: div [@ class =“courseList_section”]]'' – Gordon 2010-10-09 08:36:11

+0

你是对的,它现在可以工作。我仍然不确定我没有试过这个。这实际上是我在运行Tidy后本地使用的XPath查询 – Telanor 2010-10-09 18:45:55

0

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

编辑:其实它可能会更好,只是通过正则表达式提取所需的信息,因为页面有很多错误,这将是很难或至少繁琐的修复。

+1

-1。它看起来很脏,因为它很难维护。 – TrueWill 2011-09-09 18:16:53

0

是否有一个Web服务可以通过Tidy运行你的内容?你能写一个吗? Tidy是我知道修理破碎标记的唯一理智方式。如果你使用loadHTMLloadHTMLFile

0

考虑使用真正的浏览器或网页浏览器控件。我测试了iMacrosweb 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 =值在条目之间移动。

0

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

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