2013-08-30 31 views
0

我需要一些解析html內容的建議,需要在div內提取標籤< \ a>的id,並將其存儲到變量特定的變量中。我試圖爲此做一個正則表達式,但它在所有div中獲取標記的id。我需要存儲標籤< \ a>的ID,它只在特定div內。在perl中形成正則表達式需要幫助

HTML內容是

<div class="m_categories" id="part_one"> 
<ul> 
<li>- 
<a href="#" class="sel_cat " id="sel_cat_10018">aaa</a> 
</li> 
<li>- 
<a href="#" class="sel_cat " id="sel_cat_10007">bbb</a> 
</li> 
. 
. 
. 
</div> 

<div class="m_categories hidden" id="part_two"> 
<ul> 
<li>- 
<a href="#" class="sel_cat " id="sel_cat_10016">ccc</a> 
</li> 
<li>- 
<a href="#" class="sel_cat " id="sel_cat_10011">ddd</a> 
</li> 
<li>- 
<a href="#" class="sel_cat " id="sel_cat_10025">eee</a> 
</li> 
. 
. 
</div> 

需要一些建議,在此先感謝

更新: 我已經使用

規則運算($含量=〜米/ sel_cat「 id =「([^ <] *?)」/ is){}

while($ content =〜m/sel_cat「id =」([^ <] *?)「/ igs){}

+0

我認爲一個合適的html解析器會更容易。如果你仍然想使用正則表達式...發佈正在嘗試的正則表達式。 – Jerry

+1

Obligatory:[你不能用正則表達式解析\ [X \] HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)。 「即使Jon Skeet也不能使用正則表達式解析HTML,每當你試圖用正則表達式解析HTML時,邪惡的孩子會哭泣處女血,俄羅斯黑客就會用你的webapp。」 – DVK

回答

1

有這麼多偉大的HTML解析器。我挺喜歡的魔套裝,這讓我使用CSS選擇器來獲取DOM的一部分:

use Mojo; 

my $dom = Mojo::DOM->new($html_content); 

say for $dom->find('a.sel_cat')->all_text; 
# Or, more robust: 
# say $_->all_text for $dom->find('a.sel_cat')->each; 

輸出:

aaa 
bbb 
ccc 
ddd 
eee 

或者提出ID:

say for $dom->find('a.sel_cat')->attr('id'); 
# Or, more robust_ 
# say $_->attr('id') for $dom->find('a.sel_cat')->each; 

輸出:

sel_cat_10018 
sel_cat_10007 
sel_cat_10016 
sel_cat_10011 
sel_cat_10025 

如果您o只想在part_two div中使用選擇器#part_two a.sel_cat

+0

謝謝@Amon,但是我面臨一個錯誤 '不能通過包「Mojo :: Collection」找到對象方法「all_text」'' 但我已經安裝了包。我怎麼能解決這個問題 – Balakumar

+0

@Balakumar在這裏,你走了。有一個愚蠢的錯字(*車*而不是*貓*),其中查詢返回一個空的集合。我糾正了這一問題,並添加了沒有空結果問題的版本。 – amon

+0

非常感謝你,阿蒙:) – Balakumar

2

您應該仔細研究HTML::Parser,而不是試圖使用正則表達式來提取HTML的位。

一個辦法,我們就從中提取每個div標籤的id要素是:

# This parser only looks at opening tags 
sub start_handler { 
my ($self, $tagname, $attr, $attrseq, $origtext) = @_; 
if ($tagname eq 'div') { # is it a div element? 
     if($attr->{ id }) { # does div have an id? 
      print "div id found: ", $attr->{ id }, "\n"; 
     }  
} 
} 
my $html = &read_html_somehow() or die $!; 

my $p = HTML::Parser->new(api_version => 3); 
$p->handler(start => \&start_handler); 
$p->parse($html); 

這是很多比一個基於正則表達式的方法更加強大和靈活。

+0

或者TreeBuilder ... – DVK