2013-01-05 30 views
5

tôi nhận được một chuỗi html sử dụng curl:str_get_html không tải một chuỗi html hợp lệ

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$html_string = curl_exec($ch); 

Khi tôi echo nó tôi thấy một html hoàn toàn tốt như tôi yêu cầu cho các nhu cầu phân tích của tôi. Nhưng, khi cố gắng gửi chuỗi này đến phương thức HTML DOM PARSERstr_get_html($html_string), nó sẽ không tải lên (trả về false từ lời gọi phương thức).

Tôi đã cố gắng lưu tệp để mở và mở bằng file_get_html trên tệp nhưng điều tương tự cũng xảy ra.

Điều gì có thể là nguyên nhân của việc này? Như tôi đã nói, html trông hoàn toàn ổn khi tôi lặp lại nó.

Cảm ơn rất nhiều.

Mã chính nó:

$html = file_get_html("http://www.bgu.co.il/tremp.aspx"); 
$v = $html->find('input[id=__VIEWSTATE]'); 
$viewState = $v[0]->attr['value']; 
$e = $html->find('input=[id=__EVENTVALIDATION]'); 
$event = $e[0]->attr['value']; 

$html->clear(); 
unset($html); 

$body = " A_STRING_THAT_CONTAINS_SOME_DATA " 

$ch = curl_init("http://www.bgu.co.il/tremp.aspx"); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $body); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$html_string = curl_exec($ch); 

$file_handle = fopen("file.txt", "w"); 
fwrite($file_handle, $html_string); 
fclose($file_handle); 

curl_close($ch); 

$html = str_get_html($html_string); 
+0

Nếu bạn đăng mã, chúng tôi có thể giúp bạn. –

+0

Nó hoạt động tốt cho tôi. – pguardiario

Trả lời

1

Bạn có kiểm tra xem mã HTML được bằng cách nào đó được mã hóa theo một cách HTML DOM Parser không mong đợi? Ví dụ. với các đối tượng HTML như &lt;html&gt; thay vì <html> - vẫn sẽ được hiển thị dưới dạng HTML chính xác trong trình duyệt của bạn nhưng sẽ không phân tích cú pháp.

+0

Tôi đã lưu chuỗi đó vào tệp và xem nó bằng notepad. Các thẻ (và toàn bộ html) trông hoàn toàn hợp lệ. – Dani

0

Tôi cho rằng bạn đang sử dụng curl + str_get_html thay vì chỉ sử dụng file_get_html với URL vì thông số POST bạn cần gửi.

Bạn có thể sử dụng trình xác thực W3C này (http://validator.w3.org/#validate_by_input+with_options) để xác thực HTML trả về, sau đó, khi bạn chắc chắn kết quả là mã HTML hợp lệ 100%, bạn có thể báo cáo lỗi tại đây: http://sourceforge.net/p/simplehtmldom/bugs/.

+0

Vâng, tôi đã sử dụng trình xác thực và đã nhận được lỗi cho HTML được trả lại. Điều thú vị là khi tôi lấy trang nguồn của HTML, tôi muốn làm việc với trình duyệt web và cố gắng xác thực nó, tôi cũng nhận được lỗi. Rất tiếc điều đó không giúp ích gì cho tôi. Nếu trang HTML được trả về tải lên chính xác khi lặp lại, không phải là đủ? – Dani

+0

Vâng, điều này có nghĩa là trang bạn đang cố gắng phân tích cú pháp không phải là HTML hợp lệ, các lỗi BTW là gì? Dù sao bạn có thể cố gắng báo cáo lỗi cho dự án phân tích cú pháp HTML HTML PHP, nhưng nếu mã html bạn đang cố gắng phân tích cú pháp không thực sự hợp lệ HTML thì tôi không chắc liệu bạn có sửa lỗi này không. – FerCa

21

Bạn liên kết curl dường như có nhiều phần tử (tệp lớn).

Và tôi đang phân tích một chuỗi (tệp) lớn bằng liên kết của bạn và gặp sự cố này.

Sau khi tôi nhìn thấy mã nguồn, tôi đã tìm thấy sự cố. Nó làm việc cho tôi!


tôi thấy simple_html_dom.php có giới hạn kích thước bạn đọc.

// get html dom from string 
    function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_B  R_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) 
    { 
      $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); 
      if (empty($str) || strlen($str) > MAX_FILE_SIZE) 
      { 
        $dom->clear(); 
        return false; 
      } 
      $dom->load($str, $lowercase, $stripRN); 
      return $dom; 
    } 

bạn phải thay đổi kích thước mặc định dưới đây (Đó là trên đỉnh của simple_html_dom.php)
có thể thay đổi để 100000000? tuỳ bạn.

define('MAX_FILE_SIZE', 6000000);
+0

Cảm ơn vì điều này, câu trả lời hay nhất ở đây. Điều này đã khiến tài liệu của tôi bị lỗi. –

+0

Ước gì tôi đã thấy điều này khoảng 4 giờ gỡ lỗi trước! Cảm ơn. – user2029890

+2

Bạn Rock buddy! Cảm ơn. – Ankit

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