HTML Parser 簡單解釋

2021-05-26 02:37:14 字數 1892 閱讀 4110

html::parser 是乙個非常強大的用於處理 html 解析的模組。

html::parser 的文件沒有乙個完整的例子。所以我就把下面的我寫在 shellweb 裡的例子摘取出來,並簡單的解釋一下。

use html::parser;my $parser = html::parser->new( api_version => 3,

start_h => [/&start, "self, tagname, attr, text"],

text_h => [/&text, "self, dtext"],

end_h => [/&end, "self, tagname"],

ignore_elements => [qw(script style)],

);$parser->parse($content);

new 用於建立例項,api_version => 3 用於指定版本,因為 html::parser 還有老的版本 2,可能以後還會有新的版本。而不同的版本有不同的 api, 所以指定這個是必須的。

start_h, text_h, end_h 是三個事件處理過程。分別對應標籤的開始,文字(就是沒有標籤的地方但不包括注釋等),標籤的關閉。

其實完整的事件處理包括 text, start, end, declaration, comment, process, start_document, end_document 和 default.

一般用到的只有 text start end.

這三者接受引數的方法是一樣的。第乙個為處理方法,第二個為引數。

完整的引數參考 perldoc html::parser

最最常用的為 self, tagname, attr, text

不過注意的是不同的事件有不同的引數限制。如果 start 事件可以有 attr 但是 end 事件就沒有 attr 了。(因為結束標籤裡是不會有屬性的。)

如最開始的例子中我們使用了 start_h => [/&start, "self, tagname, attr, text"],

那麼接下來我們就定義我們自己的 start 子程式:

sub start ]");

} elsif ($tag eq 'pre') = 1;

} elsif ($tag eq 'title') = 1;

} else

}

start 子程式的第一行就是 start_h => [/&start, "self, tagname, attr, text"], 後面所對應的引數。分別對照為 self, 標籤名(如 a/img 等),屬性(這是乙個雜湊,比如 img 必定有 $attr->),text 指的是整個標籤的完整原始內容。

看起來就是這麼簡單。接下來定義 text end 子程式:

sub text ) );

if ( defined($self->) ) else

}sub end elsif ($tag eq 'p')

$self-> = undef if ($tag eq 'title');

$self-> = undef if ($tag eq 'pre');

}

這個完整的程式中間我們加了一點點小小的技巧。因為 text 事件是不知道這個文字外面的標籤名的(也就是 text_h 沒有 tagname 引數)。

這樣我們必須在 title/pre 標籤的開始時用 $self-> 儲存它開始了,在 end 時將它釋放。

這樣我們就在 text 事件中知道剛文字是不是包圍在 title 或 pre 裡面。

上面就是大致的 html::parser 分析過程。最重要的是實踐,自己設定個結果,然後用 html::parser 實現它。

實現不了出了問題看 perldoc html::parser

HTMLParser 簡單HTML和XHTML解析

使用htmlparser模組解析html頁面 href 屬性規定鏈結的目標。開始標籤和結束標籤之間的文字被作為超級鏈結來顯示。例項 visit w3school 編寫 從上面我們得知鏈結在起始標籤中,href屬性指向我們需要解析的鏈結。那麼重寫handle startag 方法來實現這個目的。在讀取...

HtmlParser程式設計

htmlparser 提供了強大的類庫來處理 internet 上的網頁,可以實現對網頁特定內容的提取和修改。1.迴圈迭代所有節點 迭代所有節點 param list param keyword public static void processnodelist nodelist list,str...

內建模組 HTMLParser

假設第一步已經完成了,第二步應該如何解析html呢?html本質上是xml的子集,但是html的語法沒有xml那麼嚴格,所以不能用標準的dom或sax來解析html。好在python提供了htmlparser來非常方便地解析html,只需簡單幾行 from html.parser import ht...