Làm cách nào để lấy mã HTML của một trang web bằng PHP?


91

Tôi muốn truy xuất mã HTML của một liên kết (trang web) bằng PHP. Ví dụ: nếu liên kết là

/programming/ask

thì tôi muốn mã HTML của trang được phân phát. Tôi muốn truy xuất mã HTML này và lưu trữ nó trong một biến PHP.

Tôi có thể làm cái này như thế nào?


Bạn có thể vui lòng giải thích nó thêm. Bạn muốn gửi một yêu cầu web đến một URL nhất định và đọc phản hồi cho một Biến mà tôi đoán?
Chathuranga Chandrasekara

Có, tôi cũng muốn điều tương tự, tôi muốn toàn bộ mã nguồn trong một biến được trả về bởi yêu cầu web đó.
Prashant

1
Bạn có thể sử dụng công cụ này để dễ dàng loại bỏ html.
Faraz Kelhini

Ngay cả khi allow_url_fopen được đặt thành true, hàm này không trả về HTML của trang? Tôi nên kiểm tra những gì khác?
CodeForGood

Câu trả lời:


140

Nếu máy chủ PHP của bạn cho phép trình bao bọc fopen url thì cách đơn giản nhất là:

$html = file_get_contents('/programming/ask');

Nếu bạn cần kiểm soát nhiều hơn thì bạn nên xem các hàm cURL :

$c = curl_init('/programming/ask');
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
//curl_setopt(... other options you want...)

$html = curl_exec($c);

if (curl_error($c))
    die(curl_error($c));

// Get the status code
$status = curl_getinfo($c, CURLINFO_HTTP_CODE);

curl_close($c);

Tôi lo lắng về 404. Trong trường hợp liên kết không tồn tại, thì tôi không muốn nội dung của nó, thay vào đó tôi muốn hiển thị thông báo lỗi ?? Làm cách nào để chúng tôi phát hiện ra rằng url có lỗi 404 hay không (chỉ đơn giản là URL menas đang hoạt động hay không)?
Prashant

1
@Prashant: Tôi đã chỉnh sửa để thêm lệnh gọi curl_getinfo sẽ cung cấp cho bạn 200 hoặc 404 hoặc bất cứ điều gì
Greg

Ngoài ra, làm thế nào PHP có thể lấy được HTML trang hiện tại?
Renaro Santos

Đây có phải là miền chéo không?
I.Am.A.Guy

Sẽ không hoạt động trên PHP7. Đã kiểm tra php.ini và fopen đang Bật.
Kaspar L. Palgi

22

Ngoài ra, nếu bạn muốn thao tác trang đã truy xuất bằng cách nào đó, bạn có thể muốn thử một số trình phân tích cú pháp DOM php. Tôi thấy PHP Simple HTML DOM Parser rất dễ sử dụng.


11

Bạn có thể muốn xem các thư viện YQL từ Yahoo: http://developer.yahoo.com/yql

Nhiệm vụ trong tầm tay đơn giản như

select * from html where url = 'http://stackoverflow.com/questions/ask'

Bạn có thể thử điều này trong bảng điều khiển tại: http://developer.yahoo.com/yql/console (yêu cầu đăng nhập)

Ngoài ra, hãy xem video màn hình của Chris Heilmanns để biết một số ý tưởng hay mà bạn có thể làm thêm: http://developer.yahoo.net/blogs/theater/archives/2009/04/screencast_collating_distributed_information.html


10

Cách đơn giản: Sử dụng file_get_contents():

$page = file_get_contents('http://stackoverflow.com/questions/ask');

Hãy lưu ý rằng allow_url_fopenphải có truetrong bạn php.iniđể có thể sử dụng giấy gói fopen URL-aware.

Cách nâng cao hơn: Nếu bạn không thể thay đổi cấu hình PHP của bạn, allow_url_fopenfalsetheo mặc định và nếu ext / curl được cài đặt, sử dụng các cURLthư viện để kết nối với các trang mong muốn.


Ngay cả khi allow_url_fopen được đặt thành true, hàm này không trả về HTML của trang? Tôi nên kiểm tra những gì khác?
CodeForGood

4

bạn có thể sử dụng file_get_contents nếu bạn muốn lưu trữ nguồn dưới dạng một biến, tuy nhiên curl là cách thực hành tốt hơn.

$url = file_get_contents('http://example.com');
echo $url; 

giải pháp này sẽ hiển thị trang web trên trang web của bạn. Tuy nhiên xoăn là một lựa chọn tốt hơn.




2

Đây là hai cách đơn giản khác nhau để lấy nội dung từ URL :

1) phương pháp đầu tiên

Bật Allow_url_include từ máy chủ của bạn (php.ini hoặc một nơi nào đó)

<?php
$variableee = readfile("http://example.com/");
echo $variableee;
?> 

hoặc là

2) phương pháp thứ hai

Bật php_curl, php_imap và php_openssl

<?php
// you can add anoother curl options too
// see here - http://php.net/manual/en/function.curl-setopt.php
function get_dataa($url) {
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

$variableee = get_dataa('http://example.com');
echo $variableee;
?>

1

bạn cũng có thể sử dụng phương pháp DomDocument để nhận một biến cấp độ thẻ HTML riêng lẻ

$homepage = file_get_contents('https://www.example.com/');
$doc = new DOMDocument;
$doc->loadHTML($homepage);
$titles = $doc->getElementsByTagName('h3');
echo $titles->item(0)->nodeValue;

1

$output = file("http://www.example.com");không hoạt động cho đến khi tôi bật: allow_url_fopen, allow_url_include,file_uploadstrong php.iniPHP7


0

Tôi đã thử mã này và nó phù hợp với tôi.

$html = file_get_contents('www.google.com');
$myVar = htmlspecialchars($html, ENT_QUOTES);
echo($myVar);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.