2012-08-02 81 views
-1

如何從Perl到Python執行以下代碼塊?Perl到Python,HTML輸出匹配模式

while ($content2 =~ m{services</B></TD>\s<TD>\s<TABLE>\s<TR>(.*?)</TABLE>}gs) { 
    my $service=$1 
    print " service : $1\n"; 
} 

完整的代碼有比這更多的正則表達式輸出,但有了這個例子,我可以繼續進行轉換。

+12

Ew。不要使用正則表達式來解析HTML。使用像lxml.html或BeautifulSoup這樣的HTML解析器。 – 2012-08-02 15:03:35

+0

'我怎樣才能做到從Perl到Python的代碼塊?'並不是說它必須是相同的技術。科林建議使用解析器。 – Logan 2012-08-02 15:29:22

回答

2

如果我正在讀你的正則表達式,你在表格數據單元格中有一個單行(沒有數據單元格)的表格。你在這裏做什麼樣的憎惡?

在Python中,你會使用lxml來做到這一點。它是一個真正的解析器,所以當文檔的空白或套管或其他不相關的結構發生更改時它不會失敗。它不是標準庫的一部分,但它是pypi上最安裝的庫之一(如果不是/)。

abominable_html = ''' 
<html> 
<table><tr><td>services</B></TD> 
    <TD> 
     <TABLE> <TR>Interesting stuff!</TABLE> 
''' 

from lxml.html import fromstring 
doc = fromstring(abominable_html) 

# These are equivalent, for demonstration purposes. 
print doc.xpath('//table/tr/td/table/tr/text()')[0] 
print doc.xpath('//table//table/tr')[0].text 

正如你所看到的,它處理有問題的HTML令人欽佩。


如果您需要匹配 「服務」 的文字,你可以添加一個條件,像這樣:

print doc.xpath('//table[./tr/td="services"]//table/tr')[0].text 

這裏有一些很好的XPath引用:

+0

我遵循你的建議。現在我正在尋求更多有關lxml的信息。 謝謝。 – 2012-08-03 11:25:25

0

我還在學習有關:)

好,我有什麼basicaly,內容由提取(。*?)是動態值(服務名稱),至極我需要插入到數據庫(在Perl中我有這個工作)。

我需要的basicaly是提取愨標籤的內容(至極是動態的)

舉個例子波紋管,用正則表達式我可以提取該服務的名稱,如果啓用了或不

$content2 =~ m{<TD valign="top"><B>name</B></TD>\s<TD>(.*?)</TD>\s</TR>\s<TR>\s<TD valign="top"><B>enabled</B></TD>\s<TD>(.*?)</TD>}gs 
$service=$1 
$status=$2 

有沒有辦法使用解析器做到這一點?如果是的話,我相信更好的辦法是關閉這個問題並開啓一個新的問題。