2012-09-08 32 views
11

Tôi đang cố gắng lấy các phần tử "liên kết" từ các trang web nhất định. Tôi không thể tìm ra những gì tôi đang làm sai mặc dù. Tôi nhận được lỗi sau:PHP DOMDocument :: loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: không có tên trong Entity

Severity: Warning

Message: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: no name in Entity, line: 536

Filename: controllers/test.php

Line Number: 34

Dòng 34 là sau trong mã:

 $dom->loadHTML($html); 

mã của tôi:

  $url = "http://www.amazon.com/"; 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    if($html = curl_exec($ch)){ 

     // parse the html into a DOMDocument 
     $dom = new DOMDocument(); 

     $dom->recover = true; 
     $dom->strictErrorChecking = false; 

     $dom->loadHTML($html); 

     $hrefs = $dom->getElementsByTagName('a'); 

     echo "<pre>"; 
     print_r($hrefs); 
     echo "</pre>"; 

     curl_close($ch); 


    }else{ 
     echo "The website could not be reached."; 
    } 
+0

Đã thay đổi thành url thân thiện với google. Hoàn nguyên nó trở lại nếu nó không thích hợp cho bạn .. –

+0

Bạn có thấy điều này không? [why-would-does-this-error-handling-function-cause-domdocument-to-hang] (http://stackoverflow.com/questions/7129115) –

Trả lời

32

Nó có nghĩa là một số mã HTML không hợp lệ . Đây chỉ là cảnh báo chứ không phải lỗi. Tập lệnh của bạn sẽ vẫn xử lý nó. Để ngăn chặn những lời cảnh báo thiết

libxml_use_internal_errors(true); 

Hoặc bạn có thể chỉ hoàn toàn ngăn chặn các cảnh báo bằng cách làm

@$dom->loadHTML($html); 
+0

vẫn nhận được cùng một lỗi – David

+0

Bạn có chắc chắn bạn đã đặt libxml_use_internal_errors (thật); ở đầu tập lệnh php? Tôi cũng cập nhật câu trả lời của mình để cung cấp một cách khác thay thế – Kris

+0

để ẩn cảnh báo, nhưng nó trả về một đối tượng trống – David

8

Điều này có thể được gây ra bởi một & biểu tượng giả mạo được ngay lập tức thành công bởi một thẻ thích hợp. Nếu không, bạn sẽ nhận được lỗi ; thiếu. Xem: Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,.

Giải pháp là để - thay thế các biểu tượng & với &amp;
hoặc nếu bạn phải có mà & vì nó là sau đó, có thể bạn có thể đặt nó bên trong: <![CDATA[ - ]]>

2

HTML là kém hình thành. Nếu được hình thành kém đủ tải HTML vào Tài liệu DOM thậm chí có thể không thành công. Nếu loadHTML không hoạt động thì việc nén các lỗi là vô nghĩa. Tôi khuyên bạn nên sử dụng một công cụ như HTML Tidy để "dọn sạch" HTML được định dạng kém nếu bạn không thể tải HTML vào DOM.

HTML Tidy có thể tìm thấy tại đây http://www.htacg.org/tidy-html5/

Các vấn đề liên quan