2012-01-17 2 views
8

Ho cercato di analizzare le pagine Web utilizzando il DomObject HTML per poterle utilizzare per un'applicazione per scansionarle per la qualità SEO.Come impedire a PHP DomDocument di "correggere" la stringa HTML

Tuttavia ho incontrato un problema. A scopo di verifica che ho scritto una piccola pagina HTML contenente il seguente codice HTML errato:

<head> 
<meta name="description" content="randomdesciption"> 
</head> 
<title>sometitle</title> 

Come si può vedere il titolo è al di fuori del tag head Quale è l'errore che sto cercando di rilevare.

Ora viene il problema, quando uso curl per catturare la stringa di risposta da questa pagina quindi inviarlo al documento dom per caricarlo come HTML in realtà lo aggiusta aggiungendo altri tag attorno al titolo.

<head> 
<meta name="description" content="randomdesciption"> 
</head> 
<head><title>sometitle</title></head> 

Ho controllato i dati responce arricciatura e che infatti non è il problema, in qualche modo il DomDocument php durante l'esecuzione del loadHTML() metodo risolve la sintassi html.

Ho anche provato a disattivare gli attributi di ripristino, di sostituzioneEntità e validateOnParse di DomDocument impostandoli su false, senza successo.

Ho cercato su Google ma non riesco a trovare nessuna risposta finora. Immagino che sia un po 'raro per qualcuno che in realtà vuole che il codice HTML non venga risolto.

Qualcuno sa come impedire a DomDocument di risolvere il mio html danneggiato?

Grazie in anticipo

+0

Avete preso in considerazione in esecuzione il markup tramite [ordine] (http://php.net/tidy) prima di passarlo a DOM, o anche al posto di DOM? È un'estensione utile per il rilevamento degli errori di markup. – TML

+0

Nota: questo comportamento è in realtà come specificato in HTML: '' ha un tag di apertura e chiusura opzionale ed è implicito dalla presenza di un elemento head-only come '', il che significa che un '<title>' fuori dalla testa sarà analizzato come all'interno di un elemento '<head>' con il suo tag di apertura omesso. Una volta letto in memoria, il DOM non conserva quali tag opzionali erano presenti nella sorgente in quanto non fanno parte della semantica del documento, quindi vengono sempre visualizzati come presenti. L'utilizzo di HTML_PARSE_NO_IMPLIED può avere effetti collaterali su come vengono interpretati alcuni documenti HTML validi. – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/53212/">thomasrutter</a></span> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> </div> <div class="answer-title"> <span class="text-logo margin-top-sm">A</span> <h2 class="title h4">risposta</h2> </div> <div class="item-description text-md markdown-body margin-bottom-40 voidso"> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">7<i class="fa fa-thumbs-up"></i></span> <i class="fa fa-check fa-2x"></i> </div> <div class="post-offset"> <div class="answer fmt"> <p>UPDATE: da PHP 5.4 è possibile utilizzare <a href="http://php.net/manual/en/libxml.constants.php#constant.libxml-html-noimplied" rel="nofollow noreferrer"><code class="prettyprint-override">HTML_PARSE_NO_IMPLIED</code></a></p> <pre><code class="prettyprint-override">$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED); </code></pre> <hr> <p><em>risposta originale al di sotto</em></p> <p>Non potete. In teoria <a href="http://xmlsoft.org/html/libxml-HTMLparser.html" rel="nofollow noreferrer">there is a flag <code class="prettyprint-override">HTML_PARSE_NO_IMPLIED</code> for that in libxml</a> per impedire l'aggiunta del markup implicito, ma non è accessibile da PHP.</p> <p>Su un sidenote, questo particolare comportamento sembra dipendere dallo <code class="prettyprint-override">LIBXML_VERSION</code> utilizzato.</p> <p>L'esecuzione di questo frammento:</p> <pre><code class="prettyprint-override"><?php $html = <<< HTML <head> <meta name="description" content="randomdesciption"> </head> <title>sometitle</title> HTML; $dom = new DOMDocument; $dom->loadHTML($html); $dom->formatOutput = true; echo $dom->saveHTML(), LIBXML_VERSION; </code></pre> <p>sulla mia macchina darà</p> <pre><code class="prettyprint-override"><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html> <head><meta name="description" content="randomdesciption"></head> <title>sometitle</title> </html> 20707 </code></pre> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/8893537">fonte</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2012-01-17 11:06:13</span> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/208809/">Gordon</a></span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> <!-- comments --> <div class="comments"> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+1</span></div> <div class="col-lg-11"> <p class="commenttext">Non è quello che speravo, ma almeno posso smettere di cercare qualcosa che semplicemente non c'è. Grazie per il tuo aiuto è stato molto istruttivo. – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+5</span></div> <div class="col-lg-11"> <p class="commenttext">Questo è ora disponibile in PHP v5.4 + con il [loadhtml] (http://php.net/manual/en/domdocument.loadhtml.php) secondo parametro 'opzioni' del metodo. – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1038284119" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="clearfix"> </div> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1575177025"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img.uwenku.com/uwenku/script/side.js?t=1644592048671"></script> <script type="text/javascript" src="http://img.uwenku.com/uwenku/plugin/highlight/highlight.pack.js"></script> <link href="http://img.uwenku.com/uwenku/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="5415218910" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> Ultima domanda </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://it.uwenku.com/question/p-eeegjvuo-ce.html" target="_blank" title="Come passare il parametro per funzionare in AngularJS con le promesse"> Come passare il parametro per funzionare in AngularJS con le promesse </a> </li> <li class="side_article_list_item"> 2. <a href="http://it.uwenku.com/question/p-xgjsdwpk-bk.html" target="_blank" title="Test su Django su database separato con "OperationalError: no tabella: auth_user""> Test su Django su database separato con "OperationalError: no tabella: auth_user" </a> </li> <li class="side_article_list_item"> 3. <a href="http://it.uwenku.com/question/p-njiynuvq-x.html" target="_blank" title="Come posso rendere disponibile Spring Zuul High?"> Come posso rendere disponibile Spring Zuul High? </a> </li> <li class="side_article_list_item"> 4. <a href="http://it.uwenku.com/question/p-khqxjkgz-by.html" target="_blank" title="Accesso a un database MySQL in Electron"> Accesso a un database MySQL in Electron </a> </li> <li class="side_article_list_item"> 5. <a href="http://it.uwenku.com/question/p-ktgicnsx-bx.html" target="_blank" title="angolare 2: Come ottenere solo percorso dalla piena stringa URL"> angolare 2: Come ottenere solo percorso dalla piena stringa URL </a> </li> <li class="side_article_list_item"> 6. <a href="http://it.uwenku.com/question/p-tpupsxnx-bm.html" target="_blank" title="Git: Perché rebase genera conflitti mentre l'unione non lo fa?"> Git: Perché rebase genera conflitti mentre l'unione non lo fa? </a> </li> <li class="side_article_list_item"> 7. <a href="http://it.uwenku.com/question/p-vzxpanmc-y.html" target="_blank" title="C# converti DbContextTransaction in SqlTransaction"> C# converti DbContextTransaction in SqlTransaction </a> </li> <li class="side_article_list_item"> 8. <a href="http://it.uwenku.com/question/p-rnbmqbgi-v.html" target="_blank" title="Spark SQL fallisce perché "pool costante è cresciuto passato limite JVM di 0xFFFF""> Spark SQL fallisce perché "pool costante è cresciuto passato limite JVM di 0xFFFF" </a> </li> <li class="side_article_list_item"> 9. <a href="http://it.uwenku.com/question/p-mvmxuuem-o.html" target="_blank" title="JGit ottiene file estratti"> JGit ottiene file estratti </a> </li> <li class="side_article_list_item"> 10. <a href="http://it.uwenku.com/question/p-kjcegjsb-bd.html" target="_blank" title="opzione radio "Maven progetto" non è visualizzata in Jenkins (ultima versione 2.7.1 per Windows)"> opzione radio "Maven progetto" non è visualizzata in Jenkins (ultima versione 2.7.1 per Windows) </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> Problemi correlati</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item">Nessun problema correlato^_^</li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://it.uwenku.com/contact">Contattaci</a></li> <li>© 2020 IT.UWENKU.COM</li> <li><a target="_blank" href="https://beian.miit.gov.cn/">沪ICP备13005482号-4</a></li> <li><script type="text/javascript" src="https://v1.cnzz.com/z_stat.php?id=1280101193&web_id=1280101193"></script></li> <li><a href="http://www.uwenku.com/" target="_blank" title="优文库">简体中文</a></li> <li><a href="http://hk.uwenku.com/" target="_blank" title="優文庫">繁體中文</a></li> <li><a href="http://ru.uwenku.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.uwenku.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.uwenku.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.uwenku.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.uwenku.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.uwenku.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.uwenku.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.uwenku.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.uwenku.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.uwenku.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.uwenku.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f78a970f17b19a79fc477a3378096f29"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>