简单XML能用于浏览HTML吗?

21

我想从一个表格中获取数据,但不想使用正则表达式。我喜欢使用 simplexml 来解析 RSS 订阅,想知道它是否可以用来从另一个页面中获取表格。

例如:使用 curl 或者简单的 file_get_contents() 函数获取页面内容,然后使用 simplexml 来获取表格内容?

4个回答

40

您可以使用 DOM 模块中的 loadHTML 函数,然后通过 simplexml_import_dom 将该 DOM 导入到 SimpleXML 中:

$html = file_get_contents('http://example.com/');
$doc = new DOMDocument();
$doc->loadHTML($html);
$sxml = simplexml_import_dom($doc);

1
大加1гЂ‚ж·»еЉ дғ†simplexml_import_domзљ„й“ңжҺӨе’ЊдёЂз‚№иү›дёЂж­Өзљ„и§Әй‡ЉгЂ‚ - T.J. Crowder
非常棒的技巧。不幸的是,看起来我正在工作的服务器上没有安装DOM模块。这通常是标准的吗? - chris
@chris DOM及其依赖库libxml默认情况下都会被编译进去。它们可以在编译时显式地省略或在运行时禁用,但这是非常不寻常的。 - phihag
我遇到了致命错误:“在……中找不到DOMDocument类”,我猜测我的学校服务器上运行的Linux版本很奇怪,所以缺少它。simplexml和libxml是可用的。我会请求他们安装它。谢谢。 - chris

7
如果这是XHTML - 是的,这绝对是可能的。真正的XHTML最终只是XML,因此可以使用XML解析器解析。
然而,SimpleXML仅接受严格的XML。如果您无法获得有效的XHTML,则似乎将其先通过不太严格的DOMDocument库处理就可以解决问题(源代码在此)。
<?php
  $html = file_get_contents('http://...');
  $doc = new DOMDocument();
  $doc->strictErrorChecking = FALSE;
  $doc->loadHTML($html);
  $xml = simplexml_import_dom($doc);
?>

3

我的版本 - 容错能力强,对编码问题处理得当

libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->strictErrorChecking = FALSE;
$doc->loadHTML(mb_convert_encoding($this->html_content, 'HTML-ENTITIES',  'UTF-8'));
libxml_use_internal_errors(false);
$xml = simplexml_import_dom($doc);

0

这可能取决于页面。如果页面是XHTML格式(现在大多数网页都是),那么任何XML解析器都可以使用,否则请寻找SGML解析器。这里有一个类似的问题,你可能会感兴趣:PHP中容错HTML/XML/SGML解析错误


2
大多数网页?请问数据来源是什么?另外,请在SO(或互联网上)挖掘一下,找出人们通常为什么不能正确地提供XHTML。 - Mchl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接