2012-06-06 48 views
0

關於(Extracting a URL in Python)我有一個後續問題。注意:我是SO和Python的新手,所以請隨時糾正我的禮節。使用Python在文本中查找超鏈接(後續到另一篇文章)

從我上面的帖子拉正則表達式,這正常工作對我來說:

myString = """ <iframe width="640" height="390" src="http://www.youtube.com/embed/24WIANESD7k?rel=0" frameborder="0" allowfullscreen></iframe> """ 
print re.search("(?P<url>https?://[^\s]+)", myString).group("url") 

但是我真正需要做的是通過我以前從數據庫中檢索的數據集循環。所以我做了下面,這給了我一個奇怪的錯誤,也在下面。

# Note: "data" here is actually a list of strings, not a data set  
for pseudo_url in data: 
     print re.search("(?P<url>https?://[^\s]+)", str(pseudo_url)).group("url") 

錯誤:

Traceback (most recent call last): 
    File "find_and_email_bad_press_urls.py", line 136, in <module> 
    main() 
    File "find_and_email_bad_press_urls.py", line 14, in main 
    scrubbed_urls = extract_urls_from_raw_data(raw_url_data) 
    File "find_and_email_bad_press_urls.py", line 47, in extract_urls_from_raw_data 
    print re.search("(?P<url>https?://[^\s]+)", str(pseudo_url)).group("url") 
AttributeError: 'NoneType' object has no attribute 'group' 

當我谷歌這個我發現噸無關的帖子,所以我希望能SO一些啓發。我的直覺是,正則表達式正在炸燬一些空數據,特殊字符等,但我對Python的瞭解還不夠多。投射到一個字符串也沒有幫助。

任何想法或解決方案,通過這將是非常感謝!

+3

我建議你嘗試BeautifulSoup模塊從HTML頁面中抓取數據。你的錯誤說正則表達式沒有返回任何匹配,因此沒有'group'屬性的'None'對象。 – Blender

回答

2

您的正則表達式在data的每個字符串中找不到網址。您應該檢查使號召group之前,確保你有一個匹配:

for pseudo_url in data: 
    m = re.search("(?P<url>https?://[^\s]+)", pseudo_url) 
    if m: 
     print m.group("url") 

你不需要調用str()或者如果pseudo_url已經是一個字符串。

而@Blender在他的評論中建議,如果data真的是從HTML文件中讀取的,您可能需要考慮使用Beautiful Soup而不是正則表達式。

+0

感謝Blender&alan - 這就像一個魅力。由於我是Python新手,我不知道組功能的作用。顯然,如果你試圖對空數據執行操作,你將會遇到問題!現在我只需要了解一些關於小組的感覺就很舒服。再次感謝! – Adam

+0

@Adam:學習愛文檔:http://docs.python.org/library/re.html#re.MatchObject.group - 對於記錄,正則表達式不是最好的方式去做這件事。 BeautifulSoup或其他解析器是更好的解決方案。 – Daenyth

+1

@亞當高興它幫助。如果這回答了你的問題,你可以考慮接受答案。 – alan