質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

スクレイピングで取得したurlの重複を無くしたい。

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,121

score 18

スクレイピングにてurlを取得しました。
取得後のurlに重複が生じているので、重複を無くしたいのですが、urlとして残したまま、重複を消したいです。

全体のコード

from bs4 import BeautifulSoup
import requests
html= requests.get("https://www.springfieldspringfield.co.uk/latest-movie-scripts.php?page=1").text
soup=BeautifulSoup(html,"html.parser")
links=soup.find_all("a")
urls=[]

for link in links:
    url=link.get("href")
    if "/movie_script.php?movie" in url :
        urls.append ("https://www.springfieldspringfield.co.uk"+url)

for url in urls:
    print(url)

現状

https://www.springfieldspringfield.co.uk/movie_script.php?movie=cedric-the-entertainer-live-from-the-ville
https://www.springfieldspringfield.co.uk/movie_script.php?movie=cedric-the-entertainer-live-from-the-ville
https://www.springfieldspringfield.co.uk/movie_script.php?movie=im-brent-morin
https://www.springfieldspringfield.co.uk/movie_script.php?movie=im-brent-morin
https://www.springfieldspringfield.co.uk/movie_script.php?movie=chelsea-peretti-one-of-the-greats
https://www.springfieldspringfield.co.uk/movie_script.php?movie=chelsea-peretti-one-of-the-greats
、、、


と言った形で2つずつ重複したurlがある

求めている結果

https://www.springfieldspringfield.co.uk/movie_script.php?movie=cedric-the-entertainer-live-from-the-ville

https://www.springfieldspringfield.co.uk/movie_script.php?movie=im-brent-morin

https://www.springfieldspringfield.co.uk/movie_script.php?movie=chelsea-peretti-one-of-the-greats

試したこと
dict.fromkey()の使用

for url in urls:
    l=[url]
    l_unique_order = list(dict.fromkeys(l))
    print(l_unique_order)


結果

['https://www.springfieldspringfield.co.uk/movie_script.php?movie=cedric-the-entertainer-live-from-the-ville']
['https://www.springfieldspringfield.co.uk/movie_script.php?movie=cedric-the-entertainer-live-from-the-ville']
['https://www.springfieldspringfield.co.uk/movie_script.php?movie=im-brent-morin']
['https://www.springfieldspringfield.co.uk/movie_script.php?movie=im-brent-morin']
['https://www.springfieldspringfield.co.uk/movie_script.php?movie=chelsea-peretti-one-of-the-greats']
['https://www.springfieldspringfield.co.uk/movie_script.php?movie=chelsea-peretti-one-of-the-greats']


変わらず、、。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

言った形で2つずつ重複したurlがある

常にそのような並びになるのなら、スライスしても良いでしょう。

urls = urls[::2]

もちろん読み込み時に重複を省く方が効率が良いのは間違いないです。
順序が気にならないなら集合を使うと簡潔でしょう。

順序が気になるのなら、帰属を確認してからリストに追加すれば良いです。
(OrderedSetがサードパーティで公開されているので、それを使うのもアリ。)

urls = []
for link in links:
    url = link.get("href")
    if "/movie_script.php?movie" in url:
        url = "https://www.springfieldspringfield.co.uk" + url
        if url not in urls:
            urls.append(url)

条件部は url != urls[-1] でも良いでしょう。

また、continueを上手く使うとネストが減り、コードが読み易くなることを期待できます。

urls = []
for link in links:
    url = link.get("href")
    if "/movie_script.php?movie" not in url:
        continue

    url = "https://www.springfieldspringfield.co.uk" + url
    if url not in urls:
        urls.append(url)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/18 19:25

    コードまでつけて頂きありがとうございます!

    キャンセル

+1

ggレバいくつか出てくると思いますが、何か特殊なことがありますか?

https://www.lifewithpython.com/2013/11/python-remove-duplicates-from-lists.html
https://note.nkmk.me/python-list-unique-duplicate/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/18 19:23

    自分の検索能力が低すぎました。
    ありがとうございます!

    キャンセル

+1

Python, set型で集合演算(和集合、積集合や部分集合の判定など)
https://note.nkmk.me/python-set/

url_list = list(set(urls))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/18 19:21

    リンク先までつけて頂きありがとうございます!

    キャンセル

+1

重複しないようにスクレイピング方法を変更した方がいいように思います。

サンプル

from urllib.parse import urljoin

import requests
from bs4 import BeautifulSoup

url = 'https://www.springfieldspringfield.co.uk/latest-movie-scripts.php'

# CSSセレクタでリンクを抽出
css = 'table#latest-movie-scripts-table > tr > td:nth-of-type(1) > a'

s = requests.Session()

# ページ番号
r = s.get(url, params={"page": 1})

soup = BeautifulSoup(r.content, 'html.parser')

result = []

for i in soup.select(css):

    # URLを結合
    result.append(urljoin(url, i.get('href')))

print(result)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/18 21:54

    毎回、すごく丁寧に教えてくださり、ありがとうございます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る