2016-03-09 60 views
0

我正在研究一個簡單的程序,該程序從給定網站中提取鏈接並將它們放入列表中。之後,「todo」列表中提取的網址將以相同的方式逐漸分析。在Python中使用正則表達式時返回一個字符串

主程序正在工作,但在下一個版本中,我只想提取主頁並忽略底面(例如「www.stackoverflow.com」但不是「www.stackoverflow.com/questions/ask」)

我試圖使用re.findall函數,但它是一個list對象,它破壞了我的可迭代待辦事項列表的結構。

在使用正則表達式時是否有可能返回一個字符串?

soup = BeautifulSoup(handle, 'html.parser') 
newlinks = soup.find_all('a') 

for link in newlinks: 
    todo.append(re.findall('(http://.+)/', link.get('href'))) 
+0

嘗試'todo.extend()'如果你不想要嵌套列表 –

+0

不錯,它正在工作:-)但是有沒有另一種(也許更聰明)的方式來切斷「/ blablabla /」比我做的更好?雖然在link.get('href')中顯然只有一個符合我的正則表達式的字符串,但我使用re.findall似乎錯了。 –

+0

如果你使用的是Python 3,'urllib.parse'模塊好像可能有你想要的。我已經用一些細節更新了我的答案。 – Blckknght

回答

0

如果你只是想每輸入字符串一場比賽,不要用findall,誰是真正目的是找到很多比賽。

取而代之,使用re.match(pattern, text)來獲得match對象。檢查返回值是否爲None(表示未找到匹配),然後調用group(1)以獲得匹配的組。

請注意,您的模式並不是真正在做你說你想要的。如果您只想匹配URL的初始部分(包括域,但不包括路徑),則需要從模式的重複部分中排除斜槓。我會用'(http://[^/]+)/'。使用+?而不是+的非貪婪重複將是另一種選擇。

如果您考慮放棄整個正則表達式來處理您的網址,您可能需要嘗試使用urllib模塊。撥打urllib.parse.urlsplit會將URL分解爲以下部分:<scheme>://<netloc>/<path>?<query>#<fragment>。 (這可能是Python 3中的一個新功能,雖然我並不確定,urllib模塊在版本之間重新排列)

+0

謝謝,這非常有幫助!我從來沒有使用過re.match,但我想我現在已經明白了。首先,我必須創建匹配對象[mainurl = re.match(regex,link.get('href'))]。然後我必須確保該對象不是無[如果mainurl是None:continue]。最後,我將字符串追加到我的todo-list [todo.append(mainurl.group(1))]。我對嗎? –

+0

是的,這就是我該怎麼做。如果你在循環內沒有其他的東西要做,你可以改變if和do的邏輯'if mainurl不是None:todo.append(mainurl.group(1))' – Blckknght

+0

好極了!非常感謝你! –

相關問題