0

( Python で URL を抽出する)に関して、フォローアップの質問があります。注:私はSOと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が光を当てることができることを望んでいました. 私の推測では、正規表現はいくつかの null データ、特殊文字などで爆発していますが、それを理解するのに十分なほど Python について知りません。文字列へのキャストも役に立ちませんでした。

これを実現するためのアイデアや回避策は大歓迎です!

4

1 に答える 1

2

あなたの正規表現は、 のすべての文字列で URL を見つけていません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 の使用を検討することをお勧めします。

于 2012-06-06T02:54:01.440 に答える