2017-06-10 11 views
0

私はちょうどPythonを学び始めています。私はBeautifulSoupを使ってスクリプトを書こうとしています。私はこのスクリプトを実行したときに私が検索を行うのであれば、私はこのような結果を得る「StackOverflowの」BeautifulSoupを使ったパスの代わりに完全なURLを取得する

#!/usr/bin/python 

from bs4 import BeautifulSoup 
from six.moves import urllib 
import ssl 

sitelist = [ 
'https://www.google.com/search?q=%s', 
'https://www.bing.com/search?q=%s', 
'http://www.ask.com/web?q=%s', 
'https://duckduckgo.com/?q=%s' 
] 

ctx = ssl.create_default_context() 
ctx.check_hostname = False 
ctx.verify_mode = ssl.CERT_NONE 

query = raw_input("What do you want to search for? ") 

for url in sitelist: 
    url = url % (query) 
    try: 
     result = urllib.request.urlopen(url, context=ctx) 
     soup = BeautifulSoup(result, "lxml") 

     for link in soup.find_all('a'): 
      link = link.get('href') 
      try: 
       if query in link: 
        print(link) 
      except: 
       pass 
    except: 
     pass 

を::ここでは私がこれまで持っているものだドロップダウンリスト

/images/search?q=stackoverflow&FORM=HDRSC2 
/videos/search?q=stackoverflow&FORM=HDRSC3 
/maps?q=stackoverflow&mkt=en&FORM=HDRSC4 
https://stackoverflow.com/ 
https://stackoverflow.com/questions/ 

をし、さらにいくつかのこれらの同じ結果が再度発生します。なぜ起こるのか理解しています。複数の検索エンジンで同じ検索を行うと、結果が重複します。私が理解できないことは、混在した結果です。これらは完全なURLです。しかし、他の結果はパスのみを含む。

/images/search?q=stackoverflow&FORM=HDRSC2 
/videos/search?q=stackoverflow&FORM=HDRSC3 
/maps?q=stackoverflow&mkt=en&FORM=HDRSC4 

だから私の質問は2部です:どのように私は結果から重複を取り除くことができ

  1. パスの代わりに完全なURLを返すにはどうすればよいですか?

2番目の質問は、私が最も関心を寄せている質問です。必要に応じて、後でBashで重複を除外することができます。

また、このスクリプトのすべての建設的な批判は歓迎します。 :)

+0

(1)セットに結果のリストを変換します。 (2) 'urllib.request.urljoin()'を使います。 – DyZ

答えて

3

これは文字通り、あなたがページ上で見つけたリンクの内容を返します。

httpで始まるものは、見つかったサイトを指すリンクです。他のものは、検索ページ自体に関連する内部リンクです。この場合、検索エンジンが提供する他の検索オプションを指しています。

あなたはこれらの絶対URLにしたい場合は、あなたが送信され、元のURLとそれらを結合する必要があります。

from urllib.request import urljoin 

... 

if not link.startswith('http'): 
    link = urljoin(url, link) 
関連する問題