2017-09-11 1 views
0

を使用して特定のURLへのリンクを検索して表示するので、特定のサイトへのリンクのみを抽出しようとしています。私はこのサイトを何時間も篩い分けして次のように書きましたが、それは私のためにはうまくいきません。正規表現

match = re.compile('<a href="(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)(youtu|www.youtube|youtube|vimeo|dailymotion|)\.(.+?)"',re.DOTALL).findall(html) 
for title in match: 
    print '<a href="'+title+'>'+title+'</a>' 

上記の方法は、このエラーを与える:

print '<a href="'+title+'>'+title+'</a>' 
TypeError: cannot concatenate 'str' and 'tuple' objects 

と私は単純に「印刷=タイトル」私は掻き取っすべてのリンクは次のようになります以下の醜い結果に

('https://www.', 'youtube', 'com/watch?v=gm2SGfjvgjM') 

を取得置く場合:

<a href="https://www.youtube.com/watch?v=gm2SGfjvgjM" 

Im希望

<a href="https://www.youtube.com/watch?v=gm2SGfjvgjM">youtube</a> 
<a href="http://www.dailymotion.com/video/x5zuvuu">dailymotion</a> 

私はしばらくの間、pythonで遊んでいましたが、私は苦労しました。そしてFYI Iveは、美しいスープを見つけようと無限の時間を費やしましたが、それを手に入れませんでした。可能であれば、メソッドを完全に変更することなく、これに関する助けを感謝します。何か助けてくれてありがとう。

+0

ここでコードを実行してみてください:http://pythontutor.com –

+0

私はダニを試します。ありがとうございました前にそのサイトを見ていない。アイドル状態で走っていると同時にそこでテストすることのメリットは何ですか? –

+0

エラーが発生するのは、タプルと文字列をまとめようとしているからです。 'title'が文字列になっているかどうか分からないのであれば(あなた自身でそれを理解することはできますが)、Pythonの先生がプログラムに要する手順を1つずつ視覚的に示してくれます。 –

答えて

1

あなたのパターンは大丈夫です。問題は、内部のグループをキャプチャすることです。それらをすべて?:でキャプチャしないようにして、完全な式を一緒にキャプチャするだけになります。

p = re.compile('<a href="((?:http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)'\ 
         '(?:youtu|www.youtube|youtube|vimeo|dailymotion|)'\ 
         '\.(?:.+?))"',re.DOTALL) 
match = p.findall(html) 
for title in match: 
    print '<a href="' + title + '>' + title + '</a>' 

リンクだけでなく、ドメイン名、別の小さな変更が必要とされて保持する - 2つのグループ(前者は後者もキャプチャ)として式全体をキャプチャし、ウェブサイトの名前を:

p = re.compile('<a href="((?:http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)'\ 
         '(youtu|www.youtube|youtube|vimeo|dailymotion|)'\ 
         '\.(?:.+?))"',re.DOTALL) 

match = p.findall(html) 
for title in match: 
    print '<a href="' + title[0] + '>' + title[1] + '</a>' 

title[i]でグループにアクセスします。

+0

それはかなりうまく動作します良いCOLDSPEEDあなたの助けをありがとう。私の運をプッシュしていないなら、あなたはリンクのタイトルとしてホスト名を追加することができますか?私はいつも "(。+?または何でも)"のすべてのインスタンスが名前を付けることができ、印刷することができるという印象を受けてきましたが、このケースでは名前をつけると、解凍する価値があまりにも多くあることがわかります。なぜそれが一致しないと役に立つ情報になるのかについての洞察ありがとうございました –

+1

@BobbyPeters編集を行いました。見て、それが動作するかどうかを確認してください。 –

+1

@BobbyPeters捕獲グループを 'findall'に渡すと、捕獲グループだけが返されることに注意してください。これがどのように機能するかを知ることで、その問題を回避するのに役立ちます –

1

あなたは、単に使用することができます。

print '<a href="'+''.join(title)+'>'+title[1]+'</a>' 

あなたのマッチング要素は、各要素が一致するグループであるタプルで構成されています。したがって、それらを一緒に結合してURLを形成し、2番目の要素はリンクに名前を付けるために使用するグループになります。

+0

ありがとうy.luisエラーが出てくるまでタプルという言葉は見たことがありません。あなたが共有する知識を評価してください。 :) –

+1

あなたの歓迎。タプルに関する素晴らしいドキュメント:http://openbookproject.net/thinkcs/python/english3e/tuples.html –