2012-01-16 130 views
-2
#<link rel='canonical' href='http://www.samplewebsite.com/image/5434553/' /> 

#I am trying to grab the text in href 

image = str(Soup) 

image_re = re.compile('\<link rel=\'cononical\' href=') 

image_pat = re.findall(image_re, image) 

print image_pa 

#>> [] 

#Thanks! 
+0

什麼類型是'湯'? – soulcheck 2012-01-16 15:47:38

回答

5

編輯:這使用BeautifulSoup包,我以爲我在這個問題的前一個版本中看到。

編輯:更直接的方式是這樣的:

soup = BeautifulSoup(document) 
links = soup.findAll('link', rel='canonical') 
for link in links: 
    print link['href'] 

相反的一切,你可以使用:

soup = BeautifulSoup(document) 
links = soup("link") 
for link in links: 
    if "rel" in link and link["rel"] == 'canonical': 
     print link["href"] 
+0

+1,很酷。你需要什麼庫和/或你需要導入哪些模塊才能工作? – 2012-01-16 15:48:20

+0

只是BeautifulSoup,因爲你已經在使用 – jknupp 2012-01-16 15:49:04

+0

我不是發佈這個問題的人(另外我沒有在我看到的問題的版本中看到任何BeautifulSoup引用)。我可以看到BeautifulSoup,但我認爲未來的新手可能會發現更多有用的信息,如果您將其添加到評論或答案。 – 2012-01-16 15:52:28

0

使用兩個正則表達式:

import re 
link_tag_re = re.compile(r'(<link[^>]*>') 
# capture all link tags in your text with it. Then for each of those, use: 
href_capture = re.compile(r'href\s*=\s*(\'[^\']*\'|"[^"]*")') 

第一個正則表達式會捕獲整個<link>標籤;第二個將尋找href="something"href='something'

一般來說,儘管這個問題是一個完美的常規語言問題,但您應該使用HTML解析器。它們對於這類事情的使用要簡單得多,而且不太可能導致你的問題。

0

您應該使用HTML解析器,例如lxml.htmlBeautifulSoup。但是,如果你只想搶單linkhref,你可以使用一個簡單的正則表達式太:

re.findall(r"href=(['\"])([^\1]*)\1", url) 
0

你正在使用的數據正確的HTML解析器的更好,但如果你真的想要去沿着這條路線,然後下面將做到這一點:

>>> data = "... <link rel='canonical' href='http://www.samplewebsite.com/image/5434553/' /> ..." 
>>> 
>>> re.search("<link[^>]+?rel='canonical'[^>]+?href='([^']+)", x).group(1) 
'http://www.samplewebsite.com/image/5434553/' 
>>> 

我還注意到,您的HTML使用單引號,而不是雙引號。

0

這將是相匹配的HTML示例你給的正則表達式:

<link rel='canonical' href='(\S+)' 

但我不知道,如果正則表達式是正確的工具。對於值使用雙引號(或不帶引號)時,此正則表達式會失敗。或者如果rel和href被轉過來。

我建議使用類似BeautifulSoup的東西來查找和收集所有rel規範的href值。