2009-08-25 55 views
45

我想要一個正則表達式從HTML頁面中提取標題。目前我有這個:提取正則表達式匹配的部分

title = re.search('<title>.*</title>', html, re.IGNORECASE).group() 
if title: 
    title = title.replace('<title>', '').replace('</title>', '') 

是否有一個正則表達式只提取內容,所以我不必刪除標籤?

謝謝!

+2

哇我不能相信所有的響應調用解析整個HTML頁面只是爲了提取一個簡單的標題。什麼矯枉過正! – hoju 2009-08-27 02:02:01

+0

問題標題說明了這一切 - 給出_happens_爲HTML的例子,但一般問題是... general。 – Phil 2017-05-24 23:30:28

回答

70

使用()在正則表達式和蟒蛇group(1)檢索捕獲的字符串(re.search將返回None,如果沒有找到結果,所以不要」 t使用group()直接):

title_search = re.search('<title>(.*)</title>', html, re.IGNORECASE) 

if title_search: 
    title = title_search.group(1) 
+0

如果在找不到標題時沒有做任何事情,爲什麼直接使用group()會是一件壞事? (無論如何,你可以捕獲異常) – tonfa 2009-08-25 10:52:57

+0

是的,但大多數人忘記異常,並且當他們在運行時看到它們時真的感到驚訝:) – 2009-08-25 18:30:21

2

嘗試:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) 
+0

如果您確實想要使用REGEX進行HTML解析,請不要在匹配時直接運行.group(),因爲它可能會返回None。 – iElectric 2009-08-25 10:37:41

+0

您應該使用'。*?',這樣萬一文檔中有多個''(不太可能,但您永遠不知道)。 – tonfa 2009-08-25 10:41:47

+0

@iElectric:如果你真的想要,你可以把它放在一個除了塊的嘗試,對吧? – tonfa 2009-08-25 10:45:14

2

re.search('<title>(.*)</title>', s, re.IGNORECASE).group(1)

4

嘗試使用捕獲組:

title = re.search('<title>(.*)</title>', html, re.IGNORECASE).group(1) 
25

請不要使用正則表達式來解析標記語言。使用lxml或beautifulsoup。

+29

這取決於用例,有時候需要一個快速和骯髒的解決方案(特別是如果你不想處理每種可能的輸入)。 – tonfa 2009-08-25 10:43:41

+3

需要2分鐘才能寫出HTML,這些正則表達式會失敗或回溯,從而吃掉CPU週期。 – iElectric 2009-08-25 10:52:03

+3

但是當抓取一個網站時,他們通常不會爲了打破解析器而改變他們的html(在某些情況下,您已經需要依賴生成的html的結構而不是HTML樹來提取更多信息) 。 – tonfa 2009-08-25 11:10:26

2

使用正則表達式來解析HTML通常不是一個好主意。你可以使用任何HTML分析器,比如美麗的湯。退房http://www.crummy.com/software/BeautifulSoup/documentation.html

還記得一些人,當遇到一個問題,認爲「我知道,我將使用正則表達式。」現在他們有兩個問題。

-1

我認爲這應該足夠了:「文本」

#!python 
import re 
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE) 
pattern.search(text) 

...假設你的文本(HTML)是在一個名爲變量

這也假定沒有其他HTML標籤可以合法地嵌入到HTML TITLE標籤中,也沒有辦法合法地在這樣的容器/塊中嵌入任何其他<字符。

然而 ...

不要使用Python中HTML解析正則表達式。使用HTML解析器! (除非你打算寫一個完整的解析器,這將是一個額外的工作時各種HTML,SGML和XML解析器已經在標準庫。

如果處理「真實世界」 標籤湯 HTML (它通常不符合任何SGML/XML驗證程序),則使用BeautifulSoup包。它不在標準庫(尚未)中,但是爲此目的被廣泛推薦爲

另一個選項是:lxml .. 。它是爲正確結構化(符合標準的)HTML編寫的,但它可以選擇使用BeautifulSoup作爲解析器:ElementSoup

1

我可以向你推薦美麗的湯。湯是一個非常好的lib來解析所有的html文檔。

soup = BeatifulSoup(html_doc) 
titleName = soup.title.name 
+0

我想補充一點,那個beautifulsoup也會解析不完整的html,這真的很不錯。 – pyeleven 2013-10-21 07:52:19

2

的代碼所提供的碎片不會應付Exceptions 我建議

getattr(re.search(r"<title>(.*)</title>", s, re.IGNORECASE), 'groups', lambda:[u""])()[0] 

這如果模式沒有被發現在默認情況下會返回一個空字符串,或第一個匹配。