您的 HTML 代码的问题是标签属性没有用引号括起来:HTML 中允许不带引号的属性,但 XML 中不允许。
如果你不关心属性,你可以继续使用 Simple HTML Dom,否则你必须改变 HTML 解析器。
使用简单 HTML DOM 清理属性:
开始创建清除所有节点属性的函数:
function clearAttributes( $node )
{
foreach( $node->getAllAttributes() as $key => $val )
{
$node->$key = Null;
}
}
然后将该函数应用于您的<table>、<tr> 和<td> 节点:
clearAttributes( $table );
foreach( $table->find('tr') as $tr )
{
clearAttributes( $tr );
foreach( $tr->find( 'td' ) as $td )
{
clearAttributes( $td );
}
}
最后但同样重要的是:站点 HTML 包含大量编码字符。如果您不想在 XML 中看到很多 <td>1&#xA0;</td><td>0&#xA0;</td>,则必须在字符串中添加 utf-8 声明,然后再将其导入 SimpleXml 对象:
$xml = '<?xml version="1.0" encoding="utf-8" ?>'.html_entity_decode( $table );
$xml = new SimpleXmlElement( $xml );
phpFiddle demo
使用 DOMDocument 保留属性:
内置的DOMDocument 类比Simple HTML Dom 更强大,内存占用更少。在这种情况下,它将为您正确格式化原始 HTML。尽管看起来很简单,但它的使用很简单。
首先,您必须初始化一个DOMDocument 对象,设置libxml_use_internal_errors(以抑制格式错误的HTML 上的大量警告)并加载您的网址:
$dom = new DOMDocument();
libxml_use_internal_errors( 1 );
$dom->loadHTMLfile( 'https://secure.tibia.com/community/?subtopic=killstatistics&world=Menera' );
$dom->formatOutput = True;
然后,您检索所需的<table>:
$table = $dom->getElementsByTagName( 'table' )->item(4);
并且,就像在Simple HTML Dom 示例中一样,您必须在前面加上utf-8 声明以避免奇怪 字符:
$xml = '<?xml version="1.0" encoding="utf-8" ?>'.$dom->saveHTML( $table );
$xml = new SimpleXmlElement( $xml );
phpFiddle demo
如您所见,将节点作为 HTML 检索的 DOMDocument 语法与 Simple HTML Dom 不同:您需要始终引用主对象并指定要打印的节点作为参数:
echo $dom->saveHTML(); // print entire HTML document
echo $dom->saveHTML( $node ); // print node $node
编辑:删除 使用 DOMDocument:
要从 HTML 中删除不需要的 &#160;,您可以预加载 HTML 并使用 str_replace。
改变这一行:
$dom->loadHTMLfile( 'https://secure.tibia.com/community/?subtopic=killstatistics&world=Menera' );
用这个:
$data = file_get_contents( 'https://secure.tibia.com/community/?subtopic=killstatistics&world=Menera' );
$data = str_replace( ' ', '', $data );
$dom->loadHTML( $data );