2012-01-17 22 views
8

He intentado analizar páginas web mediante el uso del HTML DomObject para usarlas en una aplicación para escanearlas en busca de calidad SEO.Cómo evitar que PHP DomDocument "arregle" su cadena HTML

Sin embargo, me he encontrado con un problema. Para propósitos de prueba que he escrito una página html pequeña que contiene el siguiente código HTML incorrecto:

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

Como se puede ver el título está fuera de la etiqueta de la cabeza wich es el error que estoy tratando de detectar.

Ahora viene el problema, cuando uso curl para capturar la cadena de respuesta de esta página, la envío al documento dom para cargarla como HTML, lo arregla agregando otras etiquetas alrededor del título.

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

He comprobado los datos responce enrollamiento y que de hecho no es el problema, de alguna manera el DomDocument php durante la ejecución de la loadHTML() método corrige la sintaxis HTML.

También intenté desactivar DomDocument recover, replaceEntities y validateOnParse atributos configurándolos en false, sin éxito.

He estado buscando en google pero no he podido encontrar ninguna respuesta hasta el momento. Supongo que es algo raro para alguien que realmente quiere que el HTML roto no se corrija.

¿Alguien sabe cómo evitar que el DomDocument arregle mi html roto?

Gracias de antemano

+0

¿Usted ha considerado el funcionamiento de su margen de beneficio a través [ordenado] (http://php.net/tidy) antes de pasarla a DOM, o incluso en lugar de DOM? Es una extensión útil para detectar errores de marcado. – TML

+0

Nota: Este comportamiento es realmente como se especifica en HTML: '' tiene una etiqueta de apertura y cierre opcional y está implícito en la presencia de un elemento de solo cabeza como '', lo que significa que '<title>' fuera del encabezado analizado como dentro de un elemento '<head>' con su etiqueta de apertura omitida. Una vez que se lee en la memoria, el DOM no conserva las etiquetas opcionales que estaban presentes en la fuente, ya que no es parte de la semántica del documento, por lo que siempre salen como presentes. Usar HTML_PARSE_NO_IMPLIED puede tener efectos secundarios sobre cómo se interpretan algunos documentos HTML válidos. – <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">Respuesta</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>ACTUALIZACIÓN: a partir de PHP 5.4 se puede utilizar <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>Respuesta original por debajo</em></p> <p>Usted no puede. En teoría, <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> para evitar agregar marcado implícito, pero no es accesible desde PHP.</p> <p>En una nota al margen, este comportamiento particular parece depender del <code class="prettyprint-override">LIBXML_VERSION</code> utilizado.</p> <p>La ejecución de este fragmento:</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>en mi máquina 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">Fuente</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">Eso no es lo que esperaba, pero al menos puedo dejar de buscar algo que simplemente no está allí. Gracias por su ayuda, ha sido muy informativo. – <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">Esto ahora está disponible en PHP v5.4 + con el segundo parámetro 'opciones' del método [loadhtml] (http://php.net/manual/en/domdocument.loadhtml.php). – <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">Cuestiones relacionadas</div> <ul class="relative_list"> <li> 1. <a href="http://es.voidcc.com/question/p-dymuapas-g.html" target="_blank" title="¿Cómo evito que DOMDocument de Php codifique entidades html?"> ¿Cómo evito que DOMDocument de Php codifique entidades html? </a> </li> <li> 2. <a href="http://es.voidcc.com/question/p-vgktfrez-ba.html" target="_blank" title="PHP HTML DomDocument getElementById problems"> PHP HTML DomDocument getElementById problems </a> </li> <li> 3. <a href="http://es.voidcc.com/question/p-bsklewka-k.html" target="_blank" title="DOMDocument PHP pegando etiquetas HTML"> DOMDocument PHP pegando etiquetas HTML </a> </li> <li> 4. <a href="http://es.voidcc.com/question/p-krsstldw-bp.html" target="_blank" title="Evitar advertencias XML DOMDocument en php"> Evitar advertencias XML DOMDocument en php </a> </li> <li> 5. <a href="http://es.voidcc.com/question/p-nfefoanp-bw.html" target="_blank" title="¿Cómo evitar que DOMXPath expanda entidades HTML?"> ¿Cómo evitar que DOMXPath expanda entidades HTML? </a> </li> <li> 6. <a href="http://es.voidcc.com/question/p-vozoddwk-bv.html" target="_blank" title="DOMDocument en php"> DOMDocument en php </a> </li> <li> 7. <a href="http://es.voidcc.com/question/p-htnumqpt-bh.html" target="_blank" title="php DOMDocument añade <html> cabeceras con declaración DOCTYPE"> php DOMDocument añade <html> cabeceras con declaración DOCTYPE </a> </li> <li> 8. <a href="http://es.voidcc.com/question/p-tynkpfop-s.html" target="_blank" title="Deshabilitar la codificación de entidad html en PHP DOMDocument"> Deshabilitar la codificación de entidad html en PHP DOMDocument </a> </li> <li> 9. <a href="http://es.voidcc.com/question/p-bardcmna-bq.html" target="_blank" title="php DomDocument agrega etiquetas adicionales"> php DomDocument agrega etiquetas adicionales </a> </li> <li> 10. <a href="http://es.voidcc.com/question/p-hysgqcis-bv.html" target="_blank" title="Cómo evitar que DOMDocument guarde <as & lt"> Cómo evitar que DOMDocument guarde <as & lt </a> </li> <li> 11. <a href="http://es.voidcc.com/question/p-smotdzez-g.html" target="_blank" title="PHP DOMDocument error handling"> PHP DOMDocument error handling </a> </li> <li> 12. <a href="http://es.voidcc.com/question/p-ooysfvdy-bc.html" target="_blank" title="Cómo devolver el html externo de DOMDocument?"> Cómo devolver el html externo de DOMDocument? </a> </li> <li> 13. <a href="http://es.voidcc.com/question/p-vxxdnrpx-k.html" target="_blank" title="PHP DOMDocument replace DOMElement child with HTML string"> PHP DOMDocument replace DOMElement child with HTML string </a> </li> <li> 14. <a href="http://es.voidcc.com/question/p-kjjbmuku-bd.html" target="_blank" title="PHP DOMDocument Namespaces"> PHP DOMDocument Namespaces </a> </li> <li> 15. <a href="http://es.voidcc.com/question/p-pnqlvxca-u.html" target="_blank" title="¿Cómo hacer que HTML5 funcione con DOMDocument?"> ¿Cómo hacer que HTML5 funcione con DOMDocument? </a> </li> <li> 16. <a href="http://es.voidcc.com/question/p-pvsffzvm-q.html" target="_blank" title="PHP codificación con DOMDocument"> PHP codificación con DOMDocument </a> </li> <li> 17. <a href="http://es.voidcc.com/question/p-rltntxmb-b.html" target="_blank" title="PHP DOMDocument - obtener código fuente HTML de CUERPO"> PHP DOMDocument - obtener código fuente HTML de CUERPO </a> </li> <li> 18. <a href="http://es.voidcc.com/question/p-pgjuapyi-bs.html" target="_blank" title="php DomDocument innerText"> php DomDocument innerText </a> </li> <li> 19. <a href="http://es.voidcc.com/question/p-mtqnrarn-e.html" target="_blank" title="PHP DOMDocument getElementsByTagname?"> PHP DOMDocument getElementsByTagname? </a> </li> <li> 20. <a href="http://es.voidcc.com/question/p-twosobmw-w.html" target="_blank" title="DOMDocument :: saveHTML ($ domnode) en PHP 5.2?"> DOMDocument :: saveHTML ($ domnode) en PHP 5.2? </a> </li> <li> 21. <a href="http://es.voidcc.com/question/p-qfnjimmn-x.html" target="_blank" title="HTML/jQuery Tables: desplácese horizontalmente, arregle la primera columna (izquierda)"> HTML/jQuery Tables: desplácese horizontalmente, arregle la primera columna (izquierda) </a> </li> <li> 22. <a href="http://es.voidcc.com/question/p-vnhfaxfe-s.html" target="_blank" title="Cómo evitar que JAXB escape una cadena"> Cómo evitar que JAXB escape una cadena </a> </li> <li> 23. <a href="http://es.voidcc.com/question/p-euzmntjf-p.html" target="_blank" title="DOMDocument :: loadXML frente a entidades HTML"> DOMDocument :: loadXML frente a entidades HTML </a> </li> <li> 24. <a href="http://es.voidcc.com/question/p-hfogranc-m.html" target="_blank" title="Depurar un objeto DOMDocument en PHP"> Depurar un objeto DOMDocument en PHP </a> </li> <li> 25. <a href="http://es.voidcc.com/question/p-miteqvrm-p.html" target="_blank" title="Sangría con DOMDocument en PHP"> Sangría con DOMDocument en PHP </a> </li> <li> 26. <a href="http://es.voidcc.com/question/p-crxcjung-z.html" target="_blank" title="¿Puedo obtener hermanos con DOMDocument de PHP?"> ¿Puedo obtener hermanos con DOMDocument de PHP? </a> </li> <li> 27. <a href="http://es.voidcc.com/question/p-nhfzobmb-c.html" target="_blank" title="Deshabilitar advertencias al cargar HTML no formado correctamente por DomDocument (PHP)"> Deshabilitar advertencias al cargar HTML no formado correctamente por DomDocument (PHP) </a> </li> <li> 28. <a href="http://es.voidcc.com/question/p-hyizrnbo-bo.html" target="_blank" title="PHP - resaltar el texto de una cadena que contenga HTML"> PHP - resaltar el texto de una cadena que contenga HTML </a> </li> <li> 29. <a href="http://es.voidcc.com/question/p-snngeddh-bs.html" target="_blank" title="Cómo evitar que jQuery .html() escape el atributo href automáticamente?"> Cómo evitar que jQuery .html() escape el atributo href automáticamente? </a> </li> <li> 30. <a href="http://es.voidcc.com/question/p-supvhsoe-b.html" target="_blank" title="php DomDocument, requieren el primer artículo solamente"> php DomDocument, requieren el primer artículo solamente </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=1652515422166"></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"> Última pregunta </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://es.voidcc.com/question/p-pceapujc-bn.html" target="_blank" title="Derivación de instancia automática después de la declaración"> Derivación de instancia automática después de la declaración </a> </li> <li class="side_article_list_item"> 2. <a href="http://es.voidcc.com/question/p-reebddee-bk.html" target="_blank" title="soluciones para GridView.scrollTo()?"> soluciones para GridView.scrollTo()? </a> </li> <li class="side_article_list_item"> 3. <a href="http://es.voidcc.com/question/p-hzqxrrfe-be.html" target="_blank" title="pros y contras de db y ndb en google app engine"> pros y contras de db y ndb en google app engine </a> </li> <li class="side_article_list_item"> 4. <a href="http://es.voidcc.com/question/p-bdtrugsr-y.html" target="_blank" title="Cómo comprobar que la imagen ya existe/está conectada al cargar varias imágenes a la vez en C#, asp.net"> Cómo comprobar que la imagen ya existe/está conectada al cargar varias imágenes a la vez en C#, asp.net </a> </li> <li class="side_article_list_item"> 5. <a href="http://es.voidcc.com/question/p-ymlyasmr-bx.html" target="_blank" title="Prevención de multiprocesamiento de "errores de escape""> Prevención de multiprocesamiento de "errores de escape" </a> </li> <li class="side_article_list_item"> 6. <a href="http://es.voidcc.com/question/p-kdglpwea-bh.html" target="_blank" title="sobre 'PSEQ' en Haskell"> sobre 'PSEQ' en Haskell </a> </li> <li class="side_article_list_item"> 7. <a href="http://es.voidcc.com/question/p-khttckwu-bm.html" target="_blank" title="__El método de llamada no se ejecuta cuando intenta llamar a una función que no existe en el controlador yii?"> __El método de llamada no se ejecuta cuando intenta llamar a una función que no existe en el controlador yii? </a> </li> <li class="side_article_list_item"> 8. <a href="http://es.voidcc.com/question/p-anndktdk-bn.html" target="_blank" title="Language Switcher, redirigir a la página actual con symfony2.0"> Language Switcher, redirigir a la página actual con symfony2.0 </a> </li> <li class="side_article_list_item"> 9. <a href="http://es.voidcc.com/question/p-kmittgfj-bc.html" target="_blank" title="buscar y reemplazar cantar. carbonizarse. en un <String> elemento ArrayList"> buscar y reemplazar cantar. carbonizarse. en un <String> elemento ArrayList </a> </li> <li class="side_article_list_item"> 10. <a href="http://es.voidcc.com/question/p-vkljbiaw-w.html" target="_blank" title="¿Cómo puedo solucionar el error "ImportError: no module named shell" para IPython"> ¿Cómo puedo solucionar el error "ImportError: no module named shell" para IPython </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> Cuestiones relacionadas</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://es.voidcc.com/question/p-dymuapas-g.html" target="_blank" title="¿Cómo evito que DOMDocument de Php codifique entidades html?"> ¿Cómo evito que DOMDocument de Php codifique entidades html? </a> </li> <li class="side_article_list_item"> 2. <a href="http://es.voidcc.com/question/p-vgktfrez-ba.html" target="_blank" title="PHP HTML DomDocument getElementById problems"> PHP HTML DomDocument getElementById problems </a> </li> <li class="side_article_list_item"> 3. <a href="http://es.voidcc.com/question/p-bsklewka-k.html" target="_blank" title="DOMDocument PHP pegando etiquetas HTML"> DOMDocument PHP pegando etiquetas HTML </a> </li> <li class="side_article_list_item"> 4. <a href="http://es.voidcc.com/question/p-krsstldw-bp.html" target="_blank" title="Evitar advertencias XML DOMDocument en php"> Evitar advertencias XML DOMDocument en php </a> </li> <li class="side_article_list_item"> 5. <a href="http://es.voidcc.com/question/p-nfefoanp-bw.html" target="_blank" title="¿Cómo evitar que DOMXPath expanda entidades HTML?"> ¿Cómo evitar que DOMXPath expanda entidades HTML? </a> </li> <li class="side_article_list_item"> 6. <a href="http://es.voidcc.com/question/p-vozoddwk-bv.html" target="_blank" title="DOMDocument en php"> DOMDocument en php </a> </li> <li class="side_article_list_item"> 7. <a href="http://es.voidcc.com/question/p-htnumqpt-bh.html" target="_blank" title="php DOMDocument añade <html> cabeceras con declaración DOCTYPE"> php DOMDocument añade <html> cabeceras con declaración DOCTYPE </a> </li> <li class="side_article_list_item"> 8. <a href="http://es.voidcc.com/question/p-tynkpfop-s.html" target="_blank" title="Deshabilitar la codificación de entidad html en PHP DOMDocument"> Deshabilitar la codificación de entidad html en PHP DOMDocument </a> </li> <li class="side_article_list_item"> 9. <a href="http://es.voidcc.com/question/p-bardcmna-bq.html" target="_blank" title="php DomDocument agrega etiquetas adicionales"> php DomDocument agrega etiquetas adicionales </a> </li> <li class="side_article_list_item"> 10. <a href="http://es.voidcc.com/question/p-hysgqcis-bv.html" target="_blank" title="Cómo evitar que DOMDocument guarde <as & lt"> Cómo evitar que DOMDocument guarde <as & lt </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://es.voidcc.com/contact">Contactanos</a></li> <li>© 2020 ES.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>