要約
startswithとendwithを両方同時に使い、andではなくorで検索をしたい
画像およそ50件中3件しか画像が保存できていない、そもそも最初の目標は各種アイコンをクリックした際に表示されるような500pxサイズの画像
前提・実現したいこと
- startswithとendwithを両方同時に使い、andではなくorで検索をしたいです。
また、このコードを走らせたときに出力される画像には拡張子がつかず、画像としてのファイルになりません。
というのも、大抵のサイトの画像リンクにおいて画像リンクが拡張子(.jpg,.png)で終わっているのに対して、コード上でスクレイピングしてきたリンクは
html
1<img src="https://static.wikia.nocookie.net/apexlegends_gamepedia_en/images/e/e6/Site-logo.png/revision/latest?cb=20210602000018" width="200" height="179" alt="Apex Legends Wiki" data-test="fandom-community-header-community-logo"> 2
というようになっており、コード通りに取得すると保存されるファイルは
https---static-wikia-nocookie-net-apexlegends_gamepedia_en-images-e-e6-Site-logo-png-revision-latest-cb=20210602000018
というように最後が数字で終わる形となりました。
先の質問で教えてもらった通り、Windows下でファイル名として使えない文字がエラーの原因になっていたことから、問題となっていた「?」をハイフンに置き換えることにはなんとか成功しました。
しかし、そもそも切り出してくる場所として"Site-logo.png"の部分が必要だという結論に至りました。
そしてその上でsplit関数の詳細な使い方がわかりません。
具体的には、末尾でなく真ん中にある"Site-logo.png"を持ってくるためにどう書き換えればいいのかということです。
マイナス1となっているところの数値を-5にし、除外されている文字から"/"を解除することで成功しました。
まだ問題がありました。
- なぜか3件しか画像が保存できていません。
目標は50件以上あります。3件の画像LINKとそれ以外で何が違うのか見比べましたがわかりませんでした。
また保存できた画像に関して120pxのものが3件でしたが、目標はアイコンをクリックしたときに表示される500pxのものでした。 これに関してはクリックしないと元のテキスト上にはないデータということでしょうか?
長文すみません。よろしくお願いします。
質問投稿時のコードの状態(latest)
Python
1import requests 2from requests.compat import urljoin 3from bs4 import BeautifulSoup 4 5URL = 'https://apexlegends.fandom.com/wiki/Category:Ability_icons' 6images = [] 7 8soup = BeautifulSoup(requests.get(URL).content,'lxml') 9 10for link in soup.find_all("img"): 11 if link.get("src").startswith("https://static.wikia.nocookie.net/apexlegends_gamepedia_en"): 12 13 print(link.get("src")) 14 # 相対URLから絶対URLに変換 15 images.append(urljoin(URL, link.get("src"))) 16 17import re 18for target in images: 19 resp = requests.get(target) 20 f = re.sub(r'[\:|?|.|"|<|>|\|]', '-', target) 21 #with open('img/' + target.split('/')[-1], 'wb') as f: →原文 22 #マイナス1のところ変えれば中央にあるデータも持ってこれる? 23 with open('img/' + f.split('/')[-5], 'wb') as g: 24 g.write(resp.content)
質問書き始めのコードの状態
(直接問題には関係ないので読み飛ばして頂いて構いません)
Python
1import requests 2from requests.compat import urljoin 3from bs4 import BeautifulSoup 4 5URL = 'https://apexlegends.fandom.com/wiki/Category:Ability_icons' 6images = [] 7 8soup = BeautifulSoup(requests.get(URL).content,'lxml') 9 10for link in soup.find_all("img"): 11 #if link.get("src").endswith(".jpg"):if link.get("src").endswith(".png"): から変更、画像取得形式の指定?モスのサイトで.pngにてpngで終わるリンクの画像取得を確認 12 if link.get("src").startswith("https://static.wikia.nocookie.net/apexlegends_gamepedia_en"): 13 14 print(link.get("src")) 15 # 相対URLから絶対URLに変換 16 images.append(urljoin(URL, link.get("src"))) 17 18import re 19for target in images: 20 resp = requests.get(target) 21 f = re.sub(r'[\|/|:|?|.|"|<|>|\|]', '-', target) 22 with open('img/' + f.split('/')[-1], 'wb') as g: 23 g.write(resp.content)
補足情報(FW/ツールのバージョンなど)
Windows10 Python3.7 64bit Visual Studio
あなたの回答
tips
プレビュー