用正則表達式解析HTML是一個壞主意,但它似乎適用於這種情況。Perl正則表達式僅向前解析;不是從頭開始
描述:給定一個.html文件,我必須解析內部鏈接,將縮進級別,鏈接的文本和它所在的頁碼提取到外部.txt文件,然後傳遞給其他人。
所以給這個樣本HTML:
<TR valign="bottom">
<TD valign="top"><DIV style="margin-left:0px; text-indent:-0px"><A href="#101"><FONT style="font-variant:small-caps;">The “Offering“</FONT>
</A></DIV></TD>
<TD> </TD>
<TD nowrap align="right" valign="top"> </TD>
<TD align="right" valign="top">1</TD>
<TD nowrap valign="top"> </TD>
</TR>
<TR valign="bottom">
<TD valign="top"><DIV style="margin-left:15px; text-indent:-0px"><A href="#102">Sales & Property
</A></DIV></TD>
<TD> </TD>
<TD nowrap align="right" valign="top"> </TD>
<TD align="right" valign="top">2</TD>
<TD nowrap valign="top"> </TD>
</TR>
外部文件會產生:
0|The "Offering"|4
15|Sales & Property|5
(因爲它們是實際的頁面數,而不是頁碼是不同對開頁參考)。
除了第一部分,當鏈接的文本包含額外的HTML代碼,如第一個鏈接中的<Font>
標記時,我主要想到了這一點。
這裏是我的正則表達式來提取鏈接(注$字符串包含上面的HTML):
while ($string =~ m/<DIV style="margin-left:([0-9]+)px; text-indent:[-0-9]+px"><A href="#([0-9]+)">([a-zA-Z0-9\.,:;&#\s]+)<\/A>/gi) {
push(@indents,$1);
push(@linkIDs,$2);
push(@names,escapeHTML($3));
};
這將正確地提取第二個,但不是第一,因爲> <和其他符號的在HTML代碼中。
如果我改變,去年的捕獲組.+
或.*
,我得到了完整的HTML文件(當然,第一<Div><A>
和最後</A>
之間,似乎圖案從頭開始,而是從終端匹配將文件的向後
這裏是一個鏈接到一個在線的正則表達式生成器:http://regexr.com?2s0po
它正確地找到我所需要的,但在Perl我沒有得到相同的結果(就像提到的整個文件)
我似乎無法寫出任何會捕捉每個組的東西p正確 - 你會認爲「光標」會向前移動,並停在從文件開頭看到的第一個</A>
。
任何幫助或意見或指導將不勝感激。 -謝謝。
這是一個使用HTML解析器的完美場景。正則表達式完全是錯誤的工具。我不知道Perl HTML解析器的風景,但有人應該能夠向你推薦一些東西。 – 2010-08-21 02:01:19