【问题标题】:Cleaning html code from another website using php使用 php 从另一个网站清理 html 代码
【发布时间】:2016-06-30 09:17:39
【问题描述】:

我想从this 网站获取一些数据,但正如您在他们的 html 代码中看到的那样,在没有使用“”和其他一些东西的情况下,<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3 WIDTH=100%> 发生了一些奇怪的事情,所以当我遇到错误时我尝试使用 SimpleXmlElement 解析表格,我已经使用了一段时间并且在某些网站上完美运行, 我正在做类似的事情:

$html = file_get_html('https://secure.tibia.com/community/?subtopic=killstatistics&world=Menera');
$table = $html->find('table', 4);

$xml = new SimpleXmlElement($table);

我得到了一堆错误和东西,那么有没有办法在发送到 SimpleXmlElement 或使用另一种 DOM 类之前清理代码? 大家有什么推荐的?

【问题讨论】:

    标签: php parsing dom simplexml simple-html-dom


    【解决方案1】:

    您的 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 </td><td>0 </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;
    

    然后,您检索所需的&lt;table&gt;

    $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 中删除不需要的 &amp;#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( '&#160;', '', $data );
    $dom->loadHTML( $data );
    

    【讨论】:

    • 伟大的代码萌芽,确实有很大帮助,但我现在有一个小问题,当我尝试在数组array_intersect($creatureNames,$result) 之间相交值时,结果将为空,几个小时后我想通了为什么,当我对来自它返回的表的结果进行 var_dump 时,假设“Achad”它将返回 [1]=&gt; string(7) "Achad " ,它应该是 5 对吗?当我检查网站上的表格时,我注意到有 &lt;TD&gt;Achad&amp;#160;&lt;/TD&gt; 160 可能是在字符串中添加了 2 个字符,你知道如何修复它吗?
    • 您使用什么解决方案? simplehtmldom 还是 domdocument?
    • 我使用了你的 domdocument,我正在尝试 str_replace 但似乎没有任何效果
    • @Jambo 回答已编辑。让我知道它是否适合您。
    • 甜蜜!有效! $name = $tr-&gt;td[0]; $nbsp = html_entity_decode("&amp;nbsp;"); $name = str_replace($nbsp,"",$name); 也工作了,再次感谢 bud
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多