2010-02-13 68 views
14

Tôi đang cố gắng lưu một số trang web vào tệp văn bản bằng cách sử dụng tập lệnh PHP.Cách đọc một trang web bằng PHP

Làm cách nào để tải trang web vào bộ đệm tệp bằng PHP và xóa thẻ HTML?

Trả lời

61

Không ai trong số những được đảm bảo có sẵn trên máy chủ của bạn mặc dù.

+1

1 cho câu trả lời tuyệt vời! –

+0

Tôi sẽ không gọi cách sử dụng công cụ bên ngoài theo cách ngu ngốc –

+3

@YourCommonSense Tôi nghĩ phần imporant là * gọi một công cụ bên ngoài ** thông qua hệ thống() ***. Ông cũng đề cập đến thư viện cURL và gọi nó là "cách thông minh". –

5

Một cách:

$url = "http://www.brothersoft.com/publisher/xtracomponents.html"; 
$page = file_get_contents($url); 
$outfile = "xtracomponents.html"; 
file_put_contents($outfile, $page); 

Đoạn mã trên chỉ là một ví dụ và thiếu bất kỳ kiểm tra lỗi và xử lý (!).

2

Như các câu trả lời khác đã nói, các hàm luồng PHP chuẩn hoặc cURL là đặt cược tốt nhất của bạn để truy xuất HTML. Như để loại bỏ các thẻ, đây là một vài phương pháp tiếp cận:

Lựa chọn # 1: Sử dụng tiện ích Tidy, nếu có sẵn trên máy chủ của bạn, đi bộ qua cây tài liệu đệ quy và trả lại văn bản từ các nút. Một cái gì đó như thế này:

function textFromHtml(TidyNode $node) { 
    if ($node->isText()) { 
     return $node->value; 
    } else if ($node->hasChildren()) { 
     $childText = ''; 
     foreach ($node->child as $child) 
      $childText .= textFromHtml($child); 
     return $childText; 
    } 
    return ''; 
} 

Bạn có thể muốn một cái gì đó phức tạp hơn đó, ví dụ, thay thế <br /> thẻ (nơi $node->name == 'br') với dòng mới, nhưng điều này sẽ làm cho một sự khởi đầu.

Sau đó, tải văn bản của HTML vào đối tượng gọn gàng và gọi hàm của bạn trên nút nội dung. Nếu bạn có các nội dung trong một chuỗi, sử dụng:

$tidy = new tidy(); 
$tidy->parseString($contents); 
$text = textFromHtml($tidy->body()); 

Lựa chọn # 2: Sử dụng regexes dải mọi thứ giữa <>. Bạn có thể (và có lẽ nên) phát triển một regex phức tạp hơn, ví dụ, chỉ khớp các thẻ bắt đầu hoặc kết thúc HTML hợp lệ. Bất kỳ lỗi nào trong đồng bộ của trang, giống như khung góc đi lạc trong văn bản nội dung, có thể có nghĩa là đầu ra rác nếu bạn không cẩn thận. Đây là lý do tại sao Tidy rất đẹp (nó được thiết kế đặc biệt để dọn dẹp các trang xấu), nhưng nó có thể không có sẵn.

0

Tôi khuyên bạn nên xem qua lớp SimpleHTML DOM;

SimpleHTML DOM Parser at SourceForge

Với nó, bạn có thể tìm kiếm cây DOM sử dụng selectors css như với chức năng $() của jQuery hoặc PrototypeJS $$() chức năng.

Mặc dù nó hoạt động với file_get_contents() để có được nội dung của một trang web, bạn có thể vượt qua nó HTML chỉ với một số lớp cURL của bạn (nếu bạn cần phải đăng nhập, vv)

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