首頁  >  問答  >  主體

在PHP中如何解析和處理HTML/XML?

如何解析 HTML/XML 並從中提取資訊?

P粉466643318P粉466643318347 天前683

全部回覆(2)我來回復

  • P粉555696738

    P粉5556967382023-10-12 19:20:54

    嘗試簡單 HTML DOM 解析器

    • 用 PHP 5 編寫的 HTML DOM 解析器,可讓您以非常簡單的方式操作 HTML!
    • 需要 PHP 5 。
    • 支援無效 HTML。
    • 使用選擇器在 HTML 頁面上尋找標籤,就像 jQuery 一樣。
    • 在一行中從 HTML 中提取內容。
    • 下載

    注意:顧名思義,它對於簡單的任務很有用。它使用正規表示式而不是 HTML 解析器,因此對於更複雜的任務來說速度會慢得多。其大部分程式碼庫是在 2008 年編寫的,此後僅進行了少量改進。它不遵循現代 PHP 編碼標準,而且很難合併到現代 PSR 相容專案中。

    範例:

    如何取得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>';

    如何修改 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;

    從 HTML 擷取內容:

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

    抓取 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);

    回覆
    0
  • P粉115840076

    P粉1158400762023-10-12 17:24:06

    原生 XML 擴充

    我更喜歡使用原生 XML 擴充之一,因為它們與PHP 通常比所有第 3 方庫更快,並為我提供了對標記所需的所有控制。

    DOM

    #

    DOM 能夠解析和修改現實世界(損壞的)HTML,它可以執行 XPath 查詢< /a>.它是基於 libxml

    使用 DOM 需要一些時間才能提高工作效率,但在我看來,這段時間是值得的。由於 DOM 是一個與語言無關的接口,您會發現多種語言的實現,因此如果您需要更改程式語言,那麼您很可能已經知道如何使用該語言的 DOM API。

    如何使用 DOM 擴充功能已在 StackOverflow 上廣泛介紹,所以如果當您選擇使用它時,您可以確定您遇到的大多數問題都可以透過搜尋/瀏覽 Stack Overflow 來解決。

    基本用法範例一般概念概述可在其他答案中找到。

    XMLReader

    ##

    XMLReader 與 DOM 一樣,是基於 libxml。我不知道如何觸發 HTML 解析器模組,因此使用 XMLReader 解析損壞的 HTML 可能不如使用 DOM 強大,在 DOM 中您可以明確地告訴它使用 libxml 的 HTML 解析器模組。

    在另一個答案中提供了基本用法範例

    XML 解析器

    #

    XML 解析器函式庫也基於 libxml,並實作了 SAX 風格的 XML 推送解析器。對於記憶體管理來說,它可能是比 DOM 或 SimpleXML 更好的選擇,但比 XMLReader 實現的拉解析器更難使用。

    SimpleXml

    #

    當您知道 HTML 是有效的 XHTML 時,SimpleXML 是一個選項。如果您需要解析損壞的 HTML,甚至不要考慮 SimpleXml,因為它會阻塞。

    提供了基本上使用範例,並且有PHP 手冊中有很多其他範例


    第 3 方庫(基於 libxml)

    如果您喜歡使用第 3 方庫,我建議使用實際使用 DOM/libxml 下面而不是字串解析。

    FluentDom

    #

    HtmlPageDom

    phpQuery

    #

    這被描述為“廢棄軟體和錯誤:使用時需要您自擔風險”,但似乎維護程度最低。

    laminas-dom

    #

    fDOMDocument

    sabre/xml

    #

    FluidXML

    #

    第 3 方(非基於 libxml)

    基於 DOM/libxml 建置的好處是,您可以立即獲得良好的效能,因為您基於本機擴充。然而,並非所有第三方函式庫都走這條路。下面列出了其中一些

    PHP 簡單 HTML DOM 解析器

    我通常不推薦這個解析器。程式碼庫很糟糕,解析器本身相當慢並且佔用記憶體。並非所有 jQuery 選擇器(例如 子選擇器)都是可行的。任何基於 libxml 的函式庫都應該輕鬆超越這一點。

    PHP Html 解析器

    再說一遍,我不會推薦這個解析器。 CPU 使用率高時速度相當慢。也沒有清除已建立的 DOM 物件記憶體的功能。這些問題在嵌套循環中尤其嚴重。該文件本身不準確且拼寫錯誤,自 2016 年 4 月 14 日以來沒有任何修復回應。


    HTML 5

    您可以使用上述內容來解析 HTML5,但由於 HTML5 允許的標記,可能會出現一些奇怪的情況。因此,對於 HTML5,您可能需要考慮使用專用解析器。請注意,這些是用 PHP 編寫的,因此與使用較低等級語言編譯的擴充相比,效能較慢且記憶體使用量增加。

    HTML5DomDocument

    HTML5

    #

    正規表示式

    最後也是最不推薦,您可以使用正規表示式從 HTML 擷取資料一個>。一般來說,不鼓勵在 HTML 上使用正規表示式。

    您在網路上找到的大多數用於匹配標記的程式碼片段都很脆弱。在大多數情況下,它們僅適用於非常特定的 HTML 片段。微小的標記變更(例如在某處添加空格,或在標記中新增或變更屬性)可能會導致正規表示式在編寫不正確時失敗。在 HTML 上使用 RegEx 之前,您應該知道自己在做什麼。

    HTML 解析器已經知道 HTML 的語法規則。必須為您編寫的每個新正規表示式教授正規表示式。正規表示式在某些情況下很好,但這實際上取決於您的用例。

    可以編寫更可靠的解析器,但是使用正則表達式編寫完整且可靠的自訂解析器當上述庫已經存在並且在這方面做得更好時,這是浪費時間。

    另請參閱克蘇魯方式解析 Html< /a>


    #書籍

    如果你想花點錢,可以看看

    #我不隸屬於 PHP 架構師或作者。

    回覆
    0
  • 取消回覆