2012-01-17 9 views
8

Tôi đã cố gắng để phân tích các trang web bằng cách sử dụng DomObject HTML để sử dụng chúng cho một ứng dụng để quét chúng cho chất lượng SEO.Làm thế nào để ngăn chặn các DomDocument PHP từ "sửa chữa" chuỗi HTML của bạn

Tuy nhiên tôi đã gặp phải vấn đề. Đối với mục đích thử nghiệm, tôi đã viết một trang html nhỏ chứa html không chính xác sau đây:

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

Như bạn có thể thấy tiêu đề nằm ngoài thẻ đầu là lỗi mà tôi đang cố gắng phát hiện.

Bây giờ đến vấn đề, khi tôi sử dụng curl để bắt chuỗi phản hồi từ trang này, sau đó gửi nó đến tài liệu dom để tải nó dưới dạng HTML, nó thực sự sửa lỗi này bằng cách thêm một thẻ khác xung quanh tiêu đề.

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

Tôi đã kiểm tra các dữ liệu phản ứng curl và Infact đó không phải là vấn đề, bằng cách nào đó DomDocument php trong quá trình thực của loadHTML() phương pháp sửa lỗi cú pháp html.

Tôi cũng đã thử tắt tính năng khôi phục DomDocument, replaceEntities và validateOnParse bằng cách đặt chúng thành false, không cần succes.

Tôi đã tìm kiếm trên google nhưng tôi không thể tìm thấy bất kỳ câu trả lời nào cho đến nay. Tôi đoán nó là rất hiếm đối với một số người thực sự muốn HTML bị hỏng không được sửa chữa.

Bất kỳ ai biết cách ngăn DomDocument sửa lỗi html bị hỏng của tôi?

Cảm ơn trước

+0

Bạn đã xem là chạy đánh dấu của bạn thông qua [gọn gàng] (http://php.net/tidy) trước khi đi qua nó DOM, hoặc thậm chí thay cho DOM? Đó là một phần mở rộng hữu ích để phát hiện lỗi đánh dấu. – TML

+0

Lưu ý: Hành vi này thực sự được chỉ định trong HTML: '' có thẻ mở và đóng tùy chọn và được ngụ ý bởi sự hiện diện của phần tử chỉ đầu như '', có nghĩa là '<title>' bên ngoài đầu sẽ được phân tách cú pháp trong phần tử '<head>' với thẻ mở được bỏ qua. Sau khi đọc vào bộ nhớ, DOM không bảo tồn các thẻ tùy chọn nào có mặt trong nguồn vì nó không phải là một phần của ngữ nghĩa của tài liệu, do đó chúng luôn xuất ra như hiện tại. Sử dụng HTML_PARSE_NO_IMPLIED có thể có tác dụng phụ về cách một số tài liệu HTML hợp lệ được diễn giải. – <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">Trả lời</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: như của PHP 5.4, bạn có thể sử dụng <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>câu trả lời dưới đây Original</em></p> <p>bạn không thể. Theo lý thuyết <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> để ngăn chặn thêm đánh dấu ngụ ý, nhưng nó không thể truy cập từ PHP.</p> <p>Trên sidenote, hành vi cụ thể này dường như phụ thuộc vào số <code class="prettyprint-override">LIBXML_VERSION</code> được sử dụng.</p> <p>Chạy đoạn mã này:</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>trên máy tính của tôi sẽ cung cấp cho</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">Nguồn</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">Đó không phải là những gì tôi đã hy vọng nhưng ít nhất tôi có thể ngừng tìm kiếm một cái gì đó mà chỉ đơn giản là không có. Cảm ơn bạn đã giúp đỡ của bạn nó đã được nhiều thông tin nhất. – <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">Điều này hiện có sẵn trong PHP v5.4 + với tham số thứ hai của phương thức 'loadhtml] (http://php.net/manual/en/domdocument.loadhtml.php)' tùy chọn '. – <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=1644592049017"></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"> Câu hỏi mới nhất </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://vi.uwenku.com/question/p-qfyfiqrf-n.html" target="_blank" title="Đường dẫn cửa sổ Python cắt giảm"> Đường dẫn cửa sổ Python cắt giảm </a> </li> <li class="side_article_list_item"> 2. <a href="http://vi.uwenku.com/question/p-wpoaecln-bc.html" target="_blank" title="iOS7 UIScrollView contentInset not working"> iOS7 UIScrollView contentInset not working </a> </li> <li class="side_article_list_item"> 3. <a href="http://vi.uwenku.com/question/p-wuyvnjad-d.html" target="_blank" title="Thêm hình ảnh bằng pdf sử dụng jspdf"> Thêm hình ảnh bằng pdf sử dụng jspdf </a> </li> <li class="side_article_list_item"> 4. <a href="http://vi.uwenku.com/question/p-zwuaherq-a.html" target="_blank" title="Chuyển đổi giá trị số nguyên thành địa chỉ ip"> Chuyển đổi giá trị số nguyên thành địa chỉ ip </a> </li> <li class="side_article_list_item"> 5. <a href="http://vi.uwenku.com/question/p-ucmuzwdk-d.html" target="_blank" title="Cách xóa số tài liệu N trong mongodb"> Cách xóa số tài liệu N trong mongodb </a> </li> <li class="side_article_list_item"> 6. <a href="http://vi.uwenku.com/question/p-mzhewrbw-y.html" target="_blank" title="Lỗi học thuyết: "Không mở được yêu cầu '/tmp/__CG__Source.php'""> Lỗi học thuyết: "Không mở được yêu cầu '/tmp/__CG__Source.php'" </a> </li> <li class="side_article_list_item"> 7. <a href="http://vi.uwenku.com/question/p-fliehtgg-h.html" target="_blank" title="Làm cách nào để phát video (tự động phát) trong UITableViewCell trong iOS"> Làm cách nào để phát video (tự động phát) trong UITableViewCell trong iOS </a> </li> <li class="side_article_list_item"> 8. <a href="http://vi.uwenku.com/question/p-cxkxywel-bd.html" target="_blank" title="Thực hiện xử lý thay đổi kích cỡ trên QRubberband? QSizeGrip có liên quan không?"> Thực hiện xử lý thay đổi kích cỡ trên QRubberband? QSizeGrip có liên quan không? </a> </li> <li class="side_article_list_item"> 9. <a href="http://vi.uwenku.com/question/p-qgqemvpt-bm.html" target="_blank" title="Nút xóa hàng trùng lặp mục lục UITableView Mục"> Nút xóa hàng trùng lặp mục lục UITableView Mục </a> </li> <li class="side_article_list_item"> 10. <a href="http://vi.uwenku.com/question/p-gkhvgmra-v.html" target="_blank" title="Thread.Sleep (1) mất nhiều hơn 1ms"> Thread.Sleep (1) mất nhiều hơn 1ms </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> Các vấn đề liên quan</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item">Không có vấn đề liên quan^_^</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://vi.uwenku.com/contact">Liên lạc với chúng tôi</a></li> <li>© 2020 VI.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>