2012-01-17 35 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="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="4319274062" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="clearfix"> </div> <div class="relative-box"> <div class="relative">Problemi correlati</div> <ul class="relative_list"> <li> 1. <a href="http://it.voidcc.com/question/p-tqqolxta-s.html" target="_blank" title="Disabilita codifica entità HTML in PHP DOMDocument"> Disabilita codifica entità HTML in PHP DOMDocument </a> </li> <li> 2. <a href="http://it.voidcc.com/question/p-uelbrpng-e.html" target="_blank" title="PHP HTML DomDocument getElementById problemi"> PHP HTML DomDocument getElementById problemi </a> </li> <li> 3. <a href="http://it.voidcc.com/question/p-ztuuqdsv-m.html" target="_blank" title="PHP DOMDocument sostituire child DOMElement con stringa HTML"> PHP DOMDocument sostituire child DOMElement con stringa HTML </a> </li> <li> 4. <a href="http://it.voidcc.com/question/p-uxlmxvhh-b.html" target="_blank" title="PHP DOMDocument - ottenere sorgente html di BODY"> PHP DOMDocument - ottenere sorgente html di BODY </a> </li> <li> 5. <a href="http://it.voidcc.com/question/p-xkcpeevm-g.html" target="_blank" title="PHP DOMDocument error handling"> PHP DOMDocument error handling </a> </li> <li> 6. <a href="http://it.voidcc.com/question/p-rbfqufim-o.html" target="_blank" title="php DomDocument aggiunge tag extra"> php DomDocument aggiunge tag extra </a> </li> <li> 7. <a href="http://it.voidcc.com/question/p-egvzjxmt-p.html" target="_blank" title="DOMDocument :: loadXML vs. entità HTML"> DOMDocument :: loadXML vs. entità HTML </a> </li> <li> 8. <a href="http://it.voidcc.com/question/p-zlxrhsbf-bh.html" target="_blank" title="PHP DOMDocument Namespaces"> PHP DOMDocument Namespaces </a> </li> <li> 9. <a href="http://it.voidcc.com/question/p-nuszqvjs-w.html" target="_blank" title="convertendo xml DOMDocument in stringa"> convertendo xml DOMDocument in stringa </a> </li> <li> 10. <a href="http://it.voidcc.com/question/p-gccbexhb-q.html" target="_blank" title="PHP con DOMDocument"> PHP con DOMDocument </a> </li> <li> 11. <a href="http://it.voidcc.com/question/p-filpidfp-q.html" target="_blank" title="Come leggere la stringa di query in PHP e HTML?"> Come leggere la stringa di query in PHP e HTML? </a> </li> <li> 12. <a href="http://it.voidcc.com/question/p-ynugrzsm-a.html" target="_blank" title="PHP DOMDocument errori/avvertenze su tag html5"> PHP DOMDocument errori/avvertenze su tag html5 </a> </li> <li> 13. <a href="http://it.voidcc.com/question/p-zuwkbamr-cd.html" target="_blank" title="Modifica valore attributo tag con PHP DOMDocument"> Modifica valore attributo tag con PHP DOMDocument </a> </li> <li> 14. <a href="http://it.voidcc.com/question/p-ahuslmhl-u.html" target="_blank" title="Errore DOMDocument PHP Entità 'nbsp' non definita"> Errore DOMDocument PHP Entità 'nbsp' non definita </a> </li> <li> 15. <a href="http://it.voidcc.com/question/p-xfbvvezg-cd.html" target="_blank" title="Come impedire che la stringa venga internata"> Come impedire che la stringa venga internata </a> </li> <li> 16. <a href="http://it.voidcc.com/question/p-hbrtabrg-h.html" target="_blank" title="Formato documento XML creato con PHP - DomDocument"> Formato documento XML creato con PHP - DomDocument </a> </li> <li> 17. <a href="http://it.voidcc.com/question/p-nmjhyemz-m.html" target="_blank" title="Eseguire il debug di un oggetto DOMDocument in PHP"> Eseguire il debug di un oggetto DOMDocument in PHP </a> </li> <li> 18. <a href="http://it.voidcc.com/question/p-riycvqya-n.html" target="_blank" title="Evitare DOMDocument avvertenze XML in PHP"> Evitare DOMDocument avvertenze XML in PHP </a> </li> <li> 19. <a href="http://it.voidcc.com/question/p-efrsbagr-bo.html" target="_blank" title="Come si fa a correggere una stringa indelebile?"> Come si fa a correggere una stringa indelebile? </a> </li> <li> 20. <a href="http://it.voidcc.com/question/p-fgutrrlu-x.html" target="_blank" title="Laravel 5.1 PHP DOMDocument() classe non trovata"> Laravel 5.1 PHP DOMDocument() classe non trovata </a> </li> <li> 21. <a href="http://it.voidcc.com/question/p-kkjkcaon-c.html" target="_blank" title="Loop over DOMDocument"> Loop over DOMDocument </a> </li> <li> 22. <a href="http://it.voidcc.com/question/p-pbuadvzr-p.html" target="_blank" title="Impedire django amministratore di fuggire html"> Impedire django amministratore di fuggire html </a> </li> <li> 23. <a href="http://it.voidcc.com/question/p-txxgjgxv-bk.html" target="_blank" title="Come impedire a vim di interrompere i valori letterali stringa?"> Come impedire a vim di interrompere i valori letterali stringa? </a> </li> <li> 24. <a href="http://it.voidcc.com/question/p-xgskyxnk-e.html" target="_blank" title="Posso ottenere i fratelli con DOMDocument di PHP?"> Posso ottenere i fratelli con DOMDocument di PHP? </a> </li> <li> 25. <a href="http://it.voidcc.com/question/p-xxlihctu-s.html" target="_blank" title="php DOMDocument proprietà nodeName che restituisce '#text' con il nodeName"> php DOMDocument proprietà nodeName che restituisce '#text' con il nodeName </a> </li> <li> 26. <a href="http://it.voidcc.com/question/p-euvkuqsb-c.html" target="_blank" title="PHP parsing html non valido"> PHP parsing html non valido </a> </li> <li> 27. <a href="http://it.voidcc.com/question/p-knzhbsbo-bz.html" target="_blank" title="Modifica attributo html con php"> Modifica attributo html con php </a> </li> <li> 28. <a href="http://it.voidcc.com/question/p-xlmuoobq-be.html" target="_blank" title="Come eliminare l'elemento con DOMDocument?"> Come eliminare l'elemento con DOMDocument? </a> </li> <li> 29. <a href="http://it.voidcc.com/question/p-drpxzwxj-q.html" target="_blank" title="DOMDocument :: validate() problem"> DOMDocument :: validate() problem </a> </li> <li> 30. <a href="http://it.voidcc.com/question/p-wzcjdvre-p.html" target="_blank" title="PHP - DOMDocument - necessità di modificare/sostituire un tag HTML esistente con uno nuovo"> PHP - DOMDocument - necessità di modificare/sostituire un tag HTML esistente con uno nuovo </a> </li> </ul> </div> <div> <script async src="//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="3534119089"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img2.voidcc.com/voidso/script/side.js?t=1652515422436"></script> <script type="text/javascript" src="http://img2.voidcc.com/voidso/plugin/highlight/highlight.pack.js"></script> <link href="http://img2.voidcc.com/voidso/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="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- VOIDCC问答侧边栏广告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3862022848" 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.voidcc.com/question/p-hpgjttse-bq.html" target="_blank" title="Strano comportamento DES: la decrittografia viene eseguita con successo utilizzando chiavi diverse"> Strano comportamento DES: la decrittografia viene eseguita con successo utilizzando chiavi diverse </a> </li> <li class="side_article_list_item"> 2. <a href="http://it.voidcc.com/question/p-nkxnaveo-x.html" target="_blank" title="Proprietà dell'iniezione in Asp.Net Core"> Proprietà dell'iniezione in Asp.Net Core </a> </li> <li class="side_article_list_item"> 3. <a href="http://it.voidcc.com/question/p-cvwxiwto-bv.html" target="_blank" title="d3 zoom e aggiornamento pan alla versione 4"> d3 zoom e aggiornamento pan alla versione 4 </a> </li> <li class="side_article_list_item"> 4. <a href="http://it.voidcc.com/question/p-tzntvzjq-bb.html" target="_blank" title="Come utilizzare i caricatori di Webpack in un'app Node?"> Come utilizzare i caricatori di Webpack in un'app Node? </a> </li> <li class="side_article_list_item"> 5. <a href="http://it.voidcc.com/question/p-vbjnbkxt-s.html" target="_blank" title="Utilizzo del filtro di valuta degli angoli con un numero intero di centesimi"> Utilizzo del filtro di valuta degli angoli con un numero intero di centesimi </a> </li> <li class="side_article_list_item"> 6. <a href="http://it.voidcc.com/question/p-foobgffc-s.html" target="_blank" title="Utilizzare le impostazioni comuni in SBT `RootProject`"> Utilizzare le impostazioni comuni in SBT `RootProject` </a> </li> <li class="side_article_list_item"> 7. <a href="http://it.voidcc.com/question/p-zfnnotgh-bo.html" target="_blank" title="Come gestire i valori di default nelle chiamate di funzione (profondamente) nidificate?"> Come gestire i valori di default nelle chiamate di funzione (profondamente) nidificate? </a> </li> <li class="side_article_list_item"> 8. <a href="http://it.voidcc.com/question/p-vxiwznnd-bk.html" target="_blank" title="Come utilizzare System.Windows.Forms nella libreria di classi .NET Core"> Come utilizzare System.Windows.Forms nella libreria di classi .NET Core </a> </li> <li class="side_article_list_item"> 9. <a href="http://it.voidcc.com/question/p-tvzoagfl-ba.html" target="_blank" title="Come impostare swift 3 UITextField colore del bordo?"> Come impostare swift 3 UITextField colore del bordo? </a> </li> <li class="side_article_list_item"> 10. <a href="http://it.voidcc.com/question/p-gwwvgrwo-br.html" target="_blank" title="Direttiva angolare2 - selettore con identificativi multipli"> Direttiva angolare2 - selettore con identificativi multipli </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"> 1. <a href="http://it.voidcc.com/question/p-tqqolxta-s.html" target="_blank" title="Disabilita codifica entità HTML in PHP DOMDocument"> Disabilita codifica entità HTML in PHP DOMDocument </a> </li> <li class="side_article_list_item"> 2. <a href="http://it.voidcc.com/question/p-uelbrpng-e.html" target="_blank" title="PHP HTML DomDocument getElementById problemi"> PHP HTML DomDocument getElementById problemi </a> </li> <li class="side_article_list_item"> 3. <a href="http://it.voidcc.com/question/p-ztuuqdsv-m.html" target="_blank" title="PHP DOMDocument sostituire child DOMElement con stringa HTML"> PHP DOMDocument sostituire child DOMElement con stringa HTML </a> </li> <li class="side_article_list_item"> 4. <a href="http://it.voidcc.com/question/p-uxlmxvhh-b.html" target="_blank" title="PHP DOMDocument - ottenere sorgente html di BODY"> PHP DOMDocument - ottenere sorgente html di BODY </a> </li> <li class="side_article_list_item"> 5. <a href="http://it.voidcc.com/question/p-xkcpeevm-g.html" target="_blank" title="PHP DOMDocument error handling"> PHP DOMDocument error handling </a> </li> <li class="side_article_list_item"> 6. <a href="http://it.voidcc.com/question/p-rbfqufim-o.html" target="_blank" title="php DomDocument aggiunge tag extra"> php DomDocument aggiunge tag extra </a> </li> <li class="side_article_list_item"> 7. <a href="http://it.voidcc.com/question/p-egvzjxmt-p.html" target="_blank" title="DOMDocument :: loadXML vs. entità HTML"> DOMDocument :: loadXML vs. entità HTML </a> </li> <li class="side_article_list_item"> 8. <a href="http://it.voidcc.com/question/p-zlxrhsbf-bh.html" target="_blank" title="PHP DOMDocument Namespaces"> PHP DOMDocument Namespaces </a> </li> <li class="side_article_list_item"> 9. <a href="http://it.voidcc.com/question/p-nuszqvjs-w.html" target="_blank" title="convertendo xml DOMDocument in stringa"> convertendo xml DOMDocument in stringa </a> </li> <li class="side_article_list_item"> 10. <a href="http://it.voidcc.com/question/p-gccbexhb-q.html" target="_blank" title="PHP con DOMDocument"> PHP con DOMDocument </a> </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.voidcc.com/contact">Contattaci</a></li> <li>© 2020 IT.VOIDCC.COM</li> <li><a rel="nofollow" href="https://beian.miit.gov.cn/" target="_blank">沪ICP备13005482号-13</a></li> <li><script type="text/javascript" src="https://s9.cnzz.com/z_stat.php?id=1280098168&web_id=1280098168"></script></li> <li><a href="http://cn.voidcc.com/" target="_blank" title="程序问答园区">简体中文</a></li> <li><a href="http://hk.voidcc.com/" target="_blank" title="程序問答園區">繁體中文</a></li> <li><a href="http://ru.voidcc.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.voidcc.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.voidcc.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.voidcc.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.voidcc.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.voidcc.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.voidcc.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.voidcc.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.voidcc.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.voidcc.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.voidcc.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-77509369-5"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'UA-77509369-5'); </script> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?67d4731349f0b00136755b80364ce381"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>