Câu hỏi Làm thế nào để bạn phân tích cú pháp và xử lý HTML / XML trong PHP?


Làm cách nào để phân tích cú pháp HTML / XML và trích xuất thông tin từ nó?


1896
2017-08-26 17:19


gốc




Các câu trả lời:


Các phần mở rộng XML nguyên gốc

Tôi thích sử dụng một trong các các phần mở rộng XML nguyên gốc vì chúng đi kèm với PHP, thường nhanh hơn tất cả các libs của bên thứ 3 và cung cấp cho tôi tất cả các kiểm soát mà tôi cần trên đánh dấu.

DOM

Phần mở rộng DOM cho phép bạn vận hành trên các tài liệu XML thông qua API DOM với PHP 5. Nó là một triển khai thực hiện Mô hình đối tượng tài liệu Core 3 của W3C, một giao diện trung lập nền tảng và ngôn ngữ cho phép các chương trình và kịch bản truy cập và cập nhật động nội dung, cấu trúc và phong cách của tài liệu.

DOM có khả năng phân tích cú pháp và sửa đổi HTML thế giới thực (bị hỏng) và nó có thể làm Truy vấn XPath. Dựa theo libxml.

Phải mất một thời gian để làm việc hiệu quả với DOM, nhưng thời gian đó cũng xứng đáng với IMO. Vì DOM là một giao diện độc lập về ngôn ngữ, bạn sẽ tìm thấy các triển khai bằng nhiều ngôn ngữ, vì vậy nếu bạn cần thay đổi ngôn ngữ lập trình của mình, rất có thể bạn sẽ biết cách sử dụng DOM API của ngôn ngữ đó.

Một ví dụ sử dụng cơ bản có thể được tìm thấy trong Lấy thuộc tính href của một phần tử A và có thể tìm thấy tổng quan khái niệm chung tại DOMDocument trong php

Cách sử dụng phần mở rộng DOM đã được bao quát rộng rãi trên StackOverflow, vì vậy nếu bạn chọn sử dụng nó, bạn có thể chắc chắn hầu hết các vấn đề bạn gặp phải có thể được giải quyết bằng cách tìm kiếm / duyệt Stack Overflow.

XMLReader

Phần mở rộng XMLReader là một trình phân tích cú pháp kéo XML. Người đọc hoạt động như một con trỏ tiến lên trên luồng tài liệu và dừng lại ở mỗi nút trên đường đi.

XMLReader, như DOM, dựa trên libxml. Tôi không biết cách kích hoạt Mô-đun phân tích cú pháp HTML, vì vậy rất có thể việc sử dụng XMLReader để phân tích cú pháp HTML bị hỏng có thể ít mạnh mẽ hơn việc sử dụng DOM, nơi bạn có thể nói rõ ràng để sử dụng Mô-đun phân tích cú pháp HTML của libxml.

Một ví dụ sử dụng cơ bản có thể được tìm thấy tại nhận tất cả các giá trị từ thẻ h1 bằng cách sử dụng php

Trình phân tích cú pháp XML

Phần mở rộng này cho phép bạn tạo các trình phân tích cú pháp XML và sau đó định nghĩa các trình xử lý cho các sự kiện XML khác nhau. Mỗi trình phân tích cú pháp XML cũng có một vài tham số mà bạn có thể điều chỉnh.

Thư viện XML Parser cũng dựa trên libxml và triển khai thực hiện SAX trình phân tích cú pháp đẩy XML kiểu. Nó có thể là một lựa chọn tốt hơn cho quản lý bộ nhớ hơn DOM hoặc SimpleXML, nhưng sẽ khó khăn hơn để làm việc với hơn trình phân tích cú pháp kéo được thực hiện bởi XMLReader.

SimpleXml

Phần mở rộng SimpleXML cung cấp một bộ công cụ rất đơn giản và dễ sử dụng để chuyển đổi XML thành một đối tượng có thể được xử lý với các bộ chọn thuộc tính thông thường và các bộ lặp mảng.

SimpleXML là một tùy chọn khi bạn biết HTML là XHTML hợp lệ. Nếu bạn cần phải phân tích cú pháp HTML bị hỏng, thậm chí không xem xét SimpleXml vì nó sẽ bị sặc.

Một ví dụ sử dụng cơ bản có thể được tìm thấy tại Một chương trình đơn giản cho nút CRUD và các giá trị nút của tệp xml và có nhiều ví dụ bổ sung trong Hướng dẫn sử dụng PHP.


Thư viện của bên thứ 3 (dựa trên libxml)

Nếu bạn thích sử dụng lib của bên thứ 3, tôi khuyên bạn nên sử dụng lib thực sự sử dụng DOM/libxml bên dưới thay vì phân tích cú pháp chuỗi.

FluentDom

FluentDOM cung cấp một giao diện XML thông thạo giống jQuery cho DOMDocument trong PHP. Bộ chọn được viết bằng XPath hoặc CSS (sử dụng bộ chuyển đổi CSS sang XPath). Các phiên bản hiện tại mở rộng DOM triển khai các giao diện chuẩn và thêm các tính năng từ DOM Living Standard. FluentDOM có thể tải các định dạng như JSON, CSV, JsonML, RabbitFish và các định dạng khác. Có thể được cài đặt thông qua Composer.

HtmlPageDom

Wa72 \ HtmlPageDom` là một thư viện PHP để thao tác dễ dàng với HTML   tài liệu sử dụng DomCrawler từ Symfony2   các thành phần để vượt qua   Cây DOM và mở rộng nó bằng cách thêm các phương thức để thao tác DOM   cây tài liệu HTML.

phpQuery (không được cập nhật trong nhiều năm)

phpQuery là một API theo mô hình đối tượng tài liệu hướng đối tượng (DOM) dựa trên máy chủ, có thể thay đổi được, dựa trên thư viện JavaScript jQuery được viết bằng PHP5 và cung cấp thêm giao diện dòng lệnh (CLI).

Cũng thấy: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom cung cấp các công cụ để làm việc với các tài liệu và cấu trúc DOM. Hiện tại, chúng tôi cung cấp Zend_Dom_Query, cung cấp giao diện thống nhất để truy vấn các tài liệu DOM sử dụng cả bộ chọn XPath và CSS.

QueryPath

QueryPath là một thư viện PHP để thao tác XML và HTML. Nó được thiết kế để làm việc không chỉ với các tệp cục bộ, mà còn với các dịch vụ web và tài nguyên cơ sở dữ liệu. Nó thực hiện nhiều giao diện jQuery (bao gồm cả bộ chọn kiểu CSS), nhưng nó được điều chỉnh rất nhiều cho việc sử dụng phía máy chủ. Có thể được cài đặt thông qua Composer.

fDOMDocument

fDOMDocument mở rộng DOM tiêu chuẩn để sử dụng các ngoại lệ ở tất cả các trường hợp lỗi thay vì cảnh báo hoặc thông báo PHP. Họ cũng thêm nhiều phương thức tùy chỉnh và phím tắt để thuận tiện và đơn giản hóa việc sử dụng DOM.

saber / xml

saber / xml là một thư viện kết thúc tốt đẹp và mở rộng các lớp XMLReader và XMLWriter để tạo một hệ thống ánh xạ "xml đến đối tượng / mảng" đơn giản và mẫu thiết kế. Việc viết và đọc XML là một lần và do đó có thể nhanh và yêu cầu bộ nhớ thấp trên các tệp xml lớn.

FluidXML

FluidXML là một thư viện PHP để thao tác XML với một API ngắn gọn và thông thạo.   Nó thúc đẩy XPath và mô hình lập trình thông thạo để vui vẻ và hiệu quả.


Bên thứ ba (không dựa trên libxml)

Lợi ích của việc xây dựng dựa trên DOM / libxml là bạn có hiệu suất tốt trong hộp vì bạn dựa trên tiện ích mở rộng gốc. Tuy nhiên, không phải tất cả các libs của bên thứ ba đều đi xuống tuyến đường này. Một số người trong số họ được liệt kê bên dưới

Trình phân tích cú pháp DOM HTML đơn giản PHP

  • Trình phân tích cú pháp DOM HTML được viết bằng PHP5 + cho phép bạn thao tác HTML theo cách rất dễ dàng!
  • Yêu cầu PHP 5+.
  • Hỗ trợ HTML không hợp lệ.
  • Tìm các thẻ trên một trang HTML với các bộ chọn giống như jQuery.
  • Trích xuất nội dung từ HTML trong một dòng.

Tôi thường không khuyên bạn nên phân tích cú pháp này. Các codebase là khủng khiếp và phân tích cú pháp chính nó là khá chậm và bộ nhớ đói. Không phải tất cả các bộ chọn jQuery (chẳng hạn như bộ chọn con) là có thể. Bất kỳ thư viện dựa trên libxml nào cũng sẽ hoạt động tốt hơn một cách dễ dàng.

Trình phân tích cú pháp Html PHP

PHPHtmlParser là một trình phân tích cú pháp html đơn giản, linh hoạt, cho phép bạn chọn các thẻ bằng cách sử dụng bất kỳ bộ chọn css nào, như jQuery. Mục đích là để hỗ trợ trong việc phát triển các công cụ đòi hỏi một cách nhanh chóng, dễ dàng để loại bỏ html, cho dù đó là hợp lệ hay không! Dự án này đã được hỗ trợ ban đầu bởi sunra / php-simple-html-dom-parser nhưng hỗ trợ dường như đã dừng lại để dự án này là sự thích nghi của tôi về công việc trước đây của mình.

Một lần nữa, tôi sẽ không khuyên bạn nên phân tích cú pháp này. Nó là khá chậm với việc sử dụng CPU cao. Cũng không có hàm để xóa bộ nhớ của các đối tượng DOM đã tạo. Những vấn đề này đặc biệt quy mô với các vòng lặp lồng nhau. Bản thân tài liệu không chính xác và sai chính tả, không có phản hồi để sửa lỗi kể từ ngày 14 tháng 4 năm 16.

Ganon

  • Trình mã thông báo phổ dụng và Trình phân tích cú pháp DOM HTML / XML / RSS      
    • Khả năng thao tác các yếu tố và các thuộc tính của chúng
    • Hỗ trợ HTML và UTF8 không hợp lệ
  • Có thể thực hiện các truy vấn giống như CSS3 nâng cao trên các phần tử (như các không gian tên jQuery được hỗ trợ)
  • Trình làm đẹp HTML (như HTML Tidy)      
    • Giảm bớt CSS và Javascript
    • Sắp xếp các thuộc tính, thay đổi ký tự chữ, thụt lề chính xác, v.v.
  • Có thể mở rộng      
    • Phân tích cú pháp tài liệu bằng cách sử dụng gọi lại dựa trên ký tự / mã thông báo hiện tại
    • Các thao tác được tách riêng trong các hàm nhỏ hơn để ghi đè dễ dàng
  • Nhanh và dễ

Không bao giờ sử dụng nó. Không thể nói nếu nó là tốt.


HTML 5

Bạn có thể sử dụng ở trên để phân tích cú pháp HTML5, nhưng có thể có quirks do HTML5 đánh dấu cho phép. Vì vậy, đối với HTML5 bạn muốn xem xét sử dụng trình phân tích cú pháp chuyên dụng, như

html5lib

Triển khai Python và PHP của trình phân tích cú pháp HTML dựa trên đặc tả WHATWG HTML5 cho khả năng tương thích tối đa với các trình duyệt web trên máy tính để bàn lớn.

Chúng ta có thể thấy nhiều trình phân tích cú pháp chuyên dụng hơn khi HTML5 được hoàn thành. Ngoài ra còn có một blogpost bởi tiêu đề của W3 Cách thực hiện để phân tích cú pháp html 5 đó là giá trị kiểm tra ra.


WebServices

Nếu bạn không thích lập trình PHP, bạn cũng có thể sử dụng các dịch vụ Web. Nói chung, tôi tìm thấy rất ít tiện ích cho những điều này, nhưng đó chỉ là tôi và các trường hợp sử dụng của tôi.

YQL

Dịch vụ Web YQL cho phép các ứng dụng truy vấn, lọc và kết hợp dữ liệu từ các nguồn khác nhau trên Internet. Câu lệnh YQL có cú pháp giống SQL, quen thuộc với bất kỳ nhà phát triển nào có trải nghiệm cơ sở dữ liệu.

ScraperWiki.

Giao diện bên ngoài của ScraperWiki cho phép bạn trích xuất dữ liệu dưới dạng bạn muốn sử dụng trên web hoặc trong các ứng dụng của riêng bạn. Bạn cũng có thể trích xuất thông tin về trạng thái của bất kỳ scraper nào.


Cụm từ thông dụng

Cuối cùng và ít được đề nghị, bạn có thể trích xuất dữ liệu từ HTML bằng cụm từ thông dụng. Nói chung, sử dụng Cụm từ thông dụng trên HTML không được khuyến khích.

Hầu hết các đoạn trích bạn sẽ tìm thấy trên web để phù hợp với đánh dấu là dễ vỡ. Trong hầu hết các trường hợp, họ chỉ làm việc cho một đoạn HTML rất cụ thể. Thay đổi đánh dấu nhỏ, như thêm khoảng trắng ở đâu đó hoặc thêm hoặc thay đổi thuộc tính trong thẻ, có thể khiến cho RegEx thất bại khi không được viết đúng cách. Bạn nên biết những gì bạn đang làm trước khi sử dụng RegEx trên HTML.

Các trình phân tích cú pháp HTML đã biết các quy tắc cú pháp của HTML. Biểu thức chính quy phải được dạy cho mỗi RegEx mới bạn viết. RegEx là tốt trong một số trường hợp, nhưng nó thực sự phụ thuộc vào trường hợp sử dụng của bạn.

Bạn có thể viết các trình phân tích cú pháp đáng tin cậy hơn, nhưng viết một hoàn chỉnh và đáng tin cậy trình phân tích cú pháp tùy chỉnh với các biểu thức chính quy là một sự lãng phí thời gian khi các thư viện nói trên đã tồn tại và thực hiện một công việc tốt hơn về điều này.

Cũng thấy Phân tích cú pháp Html Cách Cthulhu


Sách

Nếu bạn muốn chi tiêu một số tiền, hãy xem

Tôi không liên kết với Kiến trúc sư PHP hoặc các tác giả.


1719
2017-08-26 17:18



@ Naveed mà phụ thuộc vào nhu cầu của bạn. Tôi không cần truy vấn CSS Selector, đó là lý do tại sao tôi sử dụng DOM với XPath độc quyền. phpQuery nhằm mục đích trở thành một cổng jQuery. Zend_Dom có ​​trọng lượng nhẹ. Bạn thực sự phải kiểm tra chúng để xem cái nào bạn thích nhất. - Gordon
Điểm của bạn cho việc không sử dụng PHP PHP Parser HTML đơn giản có vẻ như là tranh luận. - Petah
Kể từ ngày 29 tháng 3 năm 2012, DOM không hỗ trợ html5, XMLReader không hỗ trợ HTML và cam kết cuối cùng trên html5lib cho PHP là vào tháng 9 năm 2009. Sử dụng gì để phân tích HTML5, HTML4 và XHTML? - Shiplu Mokaddim
@Jimmy nó không bao gồm bất cứ điều gì về cURL vì cURL không phải là một công cụ để phân tích cú pháp và xử lý HTML / XML với. cURL là một khách hàng cho các giao thức mạng khác nhau. Ví dụ: bạn có thể tìm nạp các trang web với nó. Hầu hết các thư viện ở trên đều có cách tải trực tiếp các URL từ xa, vì vậy bạn không cần cURL, ví dụ DOM có loadHTMLFile(). - Gordon
@Nasha Tôi cố tình loại trừ những tiếng rên rỉ Zalgo khét tiếng từ danh sách trên bởi vì nó không quá hữu ích trên của riêng nó và dẫn đến một số giáo phái hàng hóa khá kể từ khi nó được viết. Mọi người bị tát với liên kết đó bất kể một regex phù hợp như thế nào là một giải pháp. Để có một ý kiến ​​cân bằng hơn, vui lòng xem liên kết tôi đã làm thay vào đó và xem xét các nhận xét tại stackoverflow.com/questions/4245008/… - Gordon


Thử Trình phân tích cú pháp DOM HTML đơn giản

  • Trình phân tích cú pháp DOM HTML được viết bằng PHP 5+ cho phép bạn thao tác HTML theo cách rất dễ dàng!
  • Yêu cầu PHP 5+.
  • Hỗ trợ HTML không hợp lệ.
  • Tìm các thẻ trên một trang HTML với các bộ chọn giống như jQuery.
  • Trích xuất nội dung từ HTML trong một dòng.
  • Tải về


Ví dụ:


Cách lấy các phần tử HTML:

// Create DOM from URL or file
$html = file_get_html('http://www.example.com/');

// Find all images
foreach($html->find('img') as $element)
       echo $element->src . '<br>';

// Find all links
foreach($html->find('a') as $element)
       echo $element->href . '<br>';


Cách sửa đổi các phần tử HTML:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html;


Trích xuất nội dung từ HTML:

// Dump contents (without tags) from HTML
echo file_get_html('http://www.google.com/')->plaintext;


Cạo Slashdot:

// Create DOM from URL
$html = file_get_html('http://slashdot.org/');

// Find all article blocks
foreach($html->find('div.article') as $article) {
    $item['title']     = $article->find('div.title', 0)->plaintext;
    $item['intro']    = $article->find('div.intro', 0)->plaintext;
    $item['details'] = $article->find('div.details', 0)->plaintext;
    $articles[] = $item;
}

print_r($articles);

303
2017-11-26 20:02



Trước tiên, tôi cần chuẩn bị những thứ như DOM, mã Invlid, cũng như phân tích công cụ DNSBL, điều này cũng được sử dụng để tìm kiếm các trang web / nội dung độc hại, cũng như tôi đã xây dựng trang web của mình xung quanh một khung công tác đã xây dựng nó cần phải được sạch sẽ, dễ đọc và được cấu trúc tốt. SimpleDim là tuyệt vời nhưng mã hơi lộn xộn - RobertPitt
@ Robert, bạn cũng có thể muốn xem htmlpurifier.org cho những thứ liên quan đến an ninh. - Gordon
Anh ta có một điểm hợp lệ: đơn giảnHTMLDOM khó mở rộng, trừ khi bạn sử dụng mẫu trang trí, mà tôi thấy khó sử dụng. Tôi đã tìm thấy chính mình rùng mình chỉ cần thực hiện thay đổi cho lớp cơ bản. - Erik
Những gì tôi đã làm là chạy html của tôi thông qua gọn gàng trước khi gửi nó đến SimpleDOM. - MB34
Tôi đang sử dụng này hiện nay, chạy nó như một phần của một dự án để xử lý một vài trăm url. Nó trở nên rất chậm và thường xuyên timeouts tồn tại. Nó là một kịch bản mới bắt đầu tuyệt vời và đơn giản để học, nhưng quá cơ bản cho các dự án cao cấp hơn. - luke_mclachlan


Chỉ dùng DOMDocument-> loadHTML () và được thực hiện với nó. Thuật toán phân tích cú pháp HTML của libxml khá tốt và nhanh, và trái với niềm tin phổ biến, không bị nghẹt thở trên HTML không đúng định dạng.


224
2017-11-15 22:16



Thật. Và nó hoạt động với các lớp XPath và XSLTProcessor dựng sẵn của PHP, đây là các lớp tuyệt vời để trích xuất nội dung. - Kornel
Đối với HTML thực sự bị xáo trộn, bạn luôn có thể chạy nó thông qua htmltidy trước khi giao cho DOM. Bất cứ khi nào tôi cần phải xóa dữ liệu từ HTML, tôi luôn sử dụng DOM hoặc ít nhất là simplexml. - Frank Farmer
Một điều khác với tải HTML i không đúng định dạng mà có thể là khôn ngoan để gọi libxml_use_internal_errors (true) để ngăn chặn các cảnh báo sẽ ngừng phân tích cú pháp. - Husky
Tôi đã sử dụng DOMDocument để phân tích cú pháp khoảng 1000 nguồn html (bằng nhiều ngôn ngữ được mã hóa với các bộ ký tự khác nhau) mà không gặp bất kỳ vấn đề nào. Bạn có thể gặp sự cố mã hóa với điều này, nhưng chúng không thể vượt qua được. Bạn cần phải biết 3 điều: 1) loadHTML sử dụng bộ ký tự thẻ meta để xác định mã hóa 2) # 2 có thể dẫn đến phát hiện mã hóa không chính xác nếu nội dung html không bao gồm thông tin này 3) ký tự xấu UTF-8 có thể đi phân tích cú pháp. Trong những trường hợp như vậy, hãy sử dụng kết hợp mã hóa / chuyển đổi / tước mã của mb_detect_encoding () và Simplepie RSS Parser để giải các cách giải quyết. - Zero
DOM thực sự hỗ trợ XPath, hãy xem xét DOMXPath. - Ryan McCue


Tại sao bạn không nên và khi nào bạn nên sử dụng cụm từ thông dụng?

Trước hết, một thuật ngữ sai phổ biến: Regexps không dành cho "phân tích cú pháp" HTML. Tuy nhiên, Regexes có thể "trích xuất" dữ liệu. Trích xuất là những gì chúng được tạo ra. Hạn chế lớn của việc trích xuất HTML regex trên các bộ công cụ SGML thích hợp hoặc các trình phân tích cú pháp XML cơ sở là nỗ lực cú pháp của họ và độ tin cậy khác nhau.

Hãy xem xét việc tạo một regex trích xuất HTML có phần đáng tin cậy:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

là cách ít dễ đọc hơn so với một đơn giản tương đương với phpQuery hoặc QueryPath:

$div->find(".stationcool a")->attr("title");

Tuy nhiên, có những trường hợp sử dụng cụ thể mà họ có thể trợ giúp.

  • Nhiều giao diện DOM truyền tải không tiết lộ nhận xét HTML <!--, tuy nhiên đôi khi các neo hữu ích hơn để khai thác. Đặc biệt là các biến thể giả HTML <$var> hoặc dư lượng SGML rất dễ chế ngự bằng regexps.
  • Thông thường các cụm từ thông dụng có thể lưu sau xử lý. Tuy nhiên các thực thể HTML thường yêu cầu chăm sóc thủ công.
  • Và cuối cùng, đối với enhiệm vụ cực kỳ đơn giản giống như trích xuất <img src = url, chúng thực chất là một công cụ có thể xảy ra. Ưu điểm về tốc độ so với các trình phân tích cú pháp SGML / XML chủ yếu đến để chơi cho các thủ tục trích xuất rất cơ bản này.

Đôi khi thậm chí còn được khuyến khích để trích xuất một đoạn mã HTML bằng cách sử dụng cụm từ thông dụng /<!--CONTENT-->(.+?)<!--END-->/và xử lý phần còn lại bằng cách sử dụng giao diện người phân tích cú pháp HTML đơn giản hơn.

Chú thích: Tôi thực sự có điều này ứng dụng, trong đó tôi sử dụng phân tích cú pháp XML và các biểu thức chính quy khác. Chỉ cần tuần trước phân tích cú pháp PyQuery đã phá vỡ, và regex vẫn hoạt động. Có lạ, và tôi không thể giải thích nó. Nhưng nó đã xảy ra.
Vì vậy, xin vui lòng không bỏ phiếu cân nhắc thực tế xuống, chỉ vì nó không phù hợp với regex = meme ác. Nhưng chúng ta cũng không bỏ phiếu quá nhiều. Nó chỉ là một sidenote cho chủ đề này.


136
2018-05-01 02:04



DOMComment có thể đọc nhận xét, vì vậy không có lý do gì để sử dụng Regex cho điều đó. - Gordon
Không có bộ công cụ SGML hoặc trình phân tích cú pháp XML nào phù hợp để phân tích cú pháp HTML thực tế. Đối với điều đó, chỉ có một trình phân tích cú pháp HTML chuyên dụng là thích hợp. - Alohci
@Alohci DOM sử dụng libxml và libxml có trình phân tích cú pháp HTML riêng mô-đun sẽ được sử dụng khi tải HTML với loadHTML() do đó, nó có thể tải rất nhiều HTML "thực tế" (đọc bị hỏng). - Gordon
Vâng, chỉ là một bình luận về quan điểm "cân nhắc trong thế giới thực" của bạn. Chắc chắn, có những tình huống hữu ích cho Regex khi phân tích cú pháp HTML. Và cũng có những tình huống hữu ích để sử dụng GOTO. Và có những tình huống hữu ích cho biến biến. Vì vậy, không có triển khai cụ thể nào dứt khoát là mã-thối để sử dụng nó. Nhưng nó là một dấu hiệu cảnh báo rất mạnh. Và nhà phát triển trung bình không có khả năng đủ sắc thái để nói sự khác biệt. Vì vậy, như một quy tắc chung, Regex GOTO và biến-Biến là tất cả điều ác. Có những cách sử dụng phi ác, nhưng đó là những ngoại lệ (và hiếm có ở đó) ... (IMHO) - ircmaxell
@mario: Trên thực tế, HTML có thể được phân tích cú pháp 'đúng cách' bằng cách sử dụng các regex, mặc dù thường phải mất một vài trong số chúng để làm một công việc hợp lý là một tit. Nó chỉ là một nỗi đau hoàng gia trong trường hợp chung. Trong các trường hợp cụ thể với đầu vào được xác định rõ, nó hợp nhất trên tầm thường. Đó là những trường hợp mà mọi người Nên đang sử dụng regex trên. Những trình phân tích cú pháp nặng đói lớn thực sự là những gì bạn cần cho các trường hợp thông thường, mặc dù không phải lúc nào cũng rõ ràng đối với người dùng thông thường để vẽ đường đó. Mã nào đơn giản và dễ dàng hơn, thắng. - tchrist


phpQuery và QueryPath là cực kỳ tương tự trong việc sao chép API jQuery thông thạo. Đó cũng là lý do tại sao họ là hai phương pháp dễ nhất để đúng phân tích cú pháp HTML trong PHP.

Ví dụ cho QueryPath

Về cơ bản, trước tiên bạn tạo một cây DOM có thể truy vấn từ một chuỗi HTML:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

Đối tượng kết quả chứa một biểu diễn cây hoàn chỉnh của tài liệu HTML. Nó có thể được chuyển qua sử dụng các phương thức DOM. Nhưng cách tiếp cận phổ biến là sử dụng bộ chọn CSS như trong jQuery:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

Chủ yếu là bạn muốn sử dụng đơn giản #id và .class hoặc là DIV bộ chọn thẻ cho ->find(). Nhưng bạn cũng có thể sử dụng XPath báo cáo, đôi khi nhanh hơn. Ngoài ra các phương thức jQuery điển hình như ->children() và ->text() và đặc biệt ->attr() đơn giản hóa việc trích xuất các đoạn mã HTML phù hợp. (Và đã có các thực thể SGML của họ được giải mã.)

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

QueryPath cũng cho phép tiêm các thẻ mới vào luồng (->append), và sau đó xuất và prettify một tài liệu cập nhật (->writeHTML). Nó không chỉ phân tích cú pháp HTML không đúng định dạng, mà còn có nhiều phương ngữ XML khác nhau (với không gian tên) và thậm chí trích xuất dữ liệu từ các vi định dạng HTML (XFN, vCard).

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

.

phpQuery hoặc QueryPath?

Nói chung QueryPath là phù hợp hơn cho thao tác các tài liệu. Trong khi phpQuery cũng thực hiện một số phương thức AJAX giả (chỉ yêu cầu HTTP) để gần giống với jQuery hơn. Người ta nói rằng phpQuery thường nhanh hơn QueryPath (vì ít tính năng tổng thể hơn).

Để biết thêm thông tin về sự khác biệt, hãy xem so sánh này trên máy rút tiền từ tagbyte.org. (Nguồn gốc bị thiếu, vì vậy đây là liên kết lưu trữ trên internet. Có, bạn vẫn có thể tìm các trang bị thiếu, mọi người.)

Và đây là một giới thiệu QueryPath toàn diện.

Ưu điểm

  • Đơn giản và đáng tin cậy
  • Đơn giản để sử dụng lựa chọn thay thế ->find("a img, a object, div a")
  • Dữ liệu không đúng (so với grepping biểu thức chính quy)

126
2017-08-26 17:20





DOM HTML đơn giản là trình phân tích cú pháp nguồn mở tuyệt vời:

simplehtmldom.sourceforge

Nó xử lý các phần tử DOM theo cách hướng đối tượng và lặp lại mới có rất nhiều vùng phủ sóng cho mã không tuân thủ. Ngoài ra còn có một số chức năng tuyệt vời như bạn thấy trong JavaScript, chẳng hạn như chức năng "tìm", sẽ trả về tất cả các phiên bản của các phần tử của tên thẻ đó.

Tôi đã sử dụng nó trong một số công cụ, thử nghiệm nó trên nhiều loại trang web khác nhau và tôi nghĩ nó hoạt động rất tốt.


85
2017-10-04 13:14





Một cách tiếp cận chung mà tôi chưa từng thấy ở đây là chạy HTML thông qua Tidy, có thể được thiết lập để nhổ XHTML bảo đảm hợp lệ. Sau đó, bạn có thể sử dụng bất kỳ thư viện XML cũ nào trên đó.

Nhưng đối với vấn đề cụ thể của bạn, bạn nên xem dự án này: http://fivefilters.org/content-only/ - đó là phiên bản sửa đổi của Khả năng đọc thuật toán, được thiết kế để trích xuất nội dung văn bản (không phải đầu trang và chân trang) từ một trang.


58
2017-11-06 21:02





Đối với 1a và 2: Tôi sẽ bỏ phiếu cho lớp Symfony Componet mới DOMCrawler ( DomCrawler ). Lớp này cho phép các truy vấn tương tự như CSS Selectors. Hãy xem bản trình bày này cho các ví dụ trong thế giới thực: news-of-the-symfony2-world.

Các thành phần được thiết kế để làm việc độc lập và có thể được sử dụng mà không cần Symfony.

Hạn chế duy nhất là nó sẽ chỉ làm việc với PHP 5.3 hoặc mới hơn.


54
2018-04-14 19:08



truy vấn css giống như jquery cũng được nói, bởi vì có một số thứ bị thiếu trong tài liệu w3c, nhưng có mặt như các tính năng bổ sung trong jquery. - Nikola Petkanski


Điều này thường được gọi là màn hình cạo, nhân tiện. Thư viện tôi đã sử dụng cho việc này là Trình phân tích cú pháp Dom HTML đơn giản.


51
2018-01-05 14:49



Không đúng (en.wikipedia.org/wiki/Screen_scraping#Screen_scraping). Các đầu mối là trong "màn hình"; trong trường hợp được mô tả, không có màn hình nào liên quan. Mặc dù, phải thừa nhận, thuật ngữ này đã phải chịu đựng rất nhiều sự lạm dụng gần đây. - Bobby Jack
Im không cạo màn hình, nội dung sẽ được phân tích cú pháp sẽ được nhà cung cấp nội dung ủy quyền theo thỏa thuận của tôi. - RobertPitt