使用 php 从另一个网站清理 html 代码
Cleaning html code from another website using php
我想从 this 网站获取一些数据,但是正如您在他们的 html 代码中看到的那样,<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3 WIDTH=100%>
没有使用 "" 就发生了一些奇怪的事情,还有一些其他东西,所以当我尝试使用 SimpleXmlElement 解析 table 时遇到错误,我已经使用了一段时间并且在某些网站上运行得很好,
我正在做类似的事情:
$html = file_get_html('https://secure.tibia.com/community/?subtopic=killstatistics&world=Menera');
$table = $html->find('table', 4);
$xml = new SimpleXmlElement($table);
我收到一堆错误之类的东西,那么有没有一种方法可以在发送到 SimpleXmlElement 之前清理代码或者使用另一种 DOM class?
大家有什么推荐的?
您的 HTML 代码的问题是标签属性没有用引号引起来:HTML 允许不带引号的属性,但 XML.[=38= 不允许]
如果你不关心属性,你可以继续使用Simple HTML Dom,否则你必须改变HTML解析器。
使用 Simple 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 </td><td>0 </td>
,你必须在你的字符串前面添加一个 utf-8
声明,然后再将它导入到 SimpleXml
对象中:
$xml = '<?xml version="1.0" encoding="utf-8" ?>'.html_entity_decode( $table );
$xml = new SimpleXmlElement( $xml );
使用 DOM文档保存属性:
内置的 DOMDocument
class 比 Simple HTML Dom
更强大,占用内存更少。在这种情况下,它将为您格式化原始 HTML。虽是外表,但使用起来却很简单。
首先,您必须初始化一个 DOMDocument
对象,设置 libxml_use_internal_errors
(以抑制格式错误 HTML 的大量警告)并加载您的 url:
$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 );
如您所见,DOMDocument
检索节点的语法 HTML 与 Simple HTML Dom
不同:您始终需要引用主对象并指定要打印的节点作为参数:
echo $dom->saveHTML(); // print entire HTML document
echo $dom->saveHTML( $node ); // print node $node
编辑:删除 使用 DOM文档:
要从 HTML 中删除不需要的  
,您可以预加载 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 );
我想从 this 网站获取一些数据,但是正如您在他们的 html 代码中看到的那样,<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3 WIDTH=100%>
没有使用 "" 就发生了一些奇怪的事情,还有一些其他东西,所以当我尝试使用 SimpleXmlElement 解析 table 时遇到错误,我已经使用了一段时间并且在某些网站上运行得很好,
我正在做类似的事情:
$html = file_get_html('https://secure.tibia.com/community/?subtopic=killstatistics&world=Menera');
$table = $html->find('table', 4);
$xml = new SimpleXmlElement($table);
我收到一堆错误之类的东西,那么有没有一种方法可以在发送到 SimpleXmlElement 之前清理代码或者使用另一种 DOM class? 大家有什么推荐的?
您的 HTML 代码的问题是标签属性没有用引号引起来:HTML 允许不带引号的属性,但 XML.[=38= 不允许]
如果你不关心属性,你可以继续使用Simple HTML Dom,否则你必须改变HTML解析器。
使用 Simple 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 </td><td>0 </td>
,你必须在你的字符串前面添加一个 utf-8
声明,然后再将它导入到 SimpleXml
对象中:
$xml = '<?xml version="1.0" encoding="utf-8" ?>'.html_entity_decode( $table );
$xml = new SimpleXmlElement( $xml );
使用 DOM文档保存属性:
内置的 DOMDocument
class 比 Simple HTML Dom
更强大,占用内存更少。在这种情况下,它将为您格式化原始 HTML。虽是外表,但使用起来却很简单。
首先,您必须初始化一个 DOMDocument
对象,设置 libxml_use_internal_errors
(以抑制格式错误 HTML 的大量警告)并加载您的 url:
$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 );
如您所见,DOMDocument
检索节点的语法 HTML 与 Simple HTML Dom
不同:您始终需要引用主对象并指定要打印的节点作为参数:
echo $dom->saveHTML(); // print entire HTML document
echo $dom->saveHTML( $node ); // print node $node
编辑:删除 使用 DOM文档:
要从 HTML 中删除不需要的  
,您可以预加载 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 );