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

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

新規登録して質問してみよう
ただいま回答率
85.39%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

341閲覧

[python3] beautifulsoup4で特定タブのみのimgタブurlを抜き出したい

qwort

総合スコア1

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2023/11/22 06:57

実現したいこと

  • [1] webスクレイピングで目的の画像のみ取得したい

前提

 プログラミング初心者,python3を使用しています.
現在,webスクレイピングで画像ファイルをダウンロードするプログラミングを書いていますが,目的以外の画像を取得しないようにする方法が知りたいです.

 「イラストや」の様々な日本刀のイラストページに対して,下記コードを実行すると,バナーやサムネイルなどの画像も含んですべて取得してしまいます.
そこで,日本刀イラスト群のみ(「'div',class_='entry'」内にあるimgタブのsrc)を抜き出す方法を考えています.
① soup.find_all('div',class_='entry').find_all('img')
② soup.find_all('div',class_='entry', 'img')
③ soup_1=soup.find_all('div',class_='entry')としたあとに,soup_1.find_all('img')とするように,2段階処理を挟むのか(この方法だと最初のメソッドによりリスト化しているのでうまく行かないと思いますが),悩んでいます.
もっと簡単に処理できる方法があるならばお教えいただきたいです.よろしくお願いいたします.

該当のソースコード

python312

1url='https://www.irasutoya.com/2017/01/blog-post_417.html' 2file_dir="C:\\Users\\ユーザー名\\Desktop\\ファイル名" 3 4import time 5import os 6import requests 7from bs4 import BeautifulSoup 8 9def dl_files(url,file_dir): 10 res=requests.get(url) 11 try: 12 res_st= res.raise_for_status() 13 except Exception as exc: 14 print('Error:{}'.format(exc)) 15 16 if res_st == None: 17 soup= BeautifulSoup(res.text.encode(res.encoding),'html.parser') 18###################目的のimgタグはdiv class='entry'の階層内にある 19 img_tag= soup.find_all('img') 20################### 21 for i_t in img_tag: 22 img_url= i_t['src'] 23 if img_url.startswith('http'): 24 res_img= requests.get(img_url) 25 with open(os.path.join(file_dir,os.path.basename(img_url)),'wb') as f: 26 f.write(res_img.content) 27 time.sleep(1) 28 29# dl_files(url,file_dir)を実行する

試したこと

 google検索をして,find_allの各引数を調べましたが,タグ名(name引数)を2つ設定できるかどうかはよくわかりませんでした.英語検索などはできていません.
上記のプログラミング自体は一部投稿用に変更していますが,問題なく動作することを確認しています.

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この方法だと最初のメソッドによりリスト化しているのでうまく行かないと思いますが
soup.find_all('div',class_='entry').find_all('img')

find_allの結果はリストなので、リストの各要素に対してfind_all('img')する必要があります。

Python

1for div_tag in soup.find_all('div',class_='entry'): 2 for img_tag in div_tag..find_all('img'):

ただし、今回はdiv.entryは1つだけのようなので、

Python

1fot img_tag in soup.find('div',class_='entry').find_all('img'):

で良いかと思います。

もっと簡単に処理できる方法があるならばお教えいただきたいです.よろしくお願いいたします.

は、別の回答のようにCSSセレクターを使う方法があります。

あと、複数の要素が入ったリストを変数に代入して、その後forで各要素を処理する場合は、リストの変数名を複数形、各要素の変数名は単数形にすると分かり易いです。

Python

1tags = soup.find_all(~~~) 2for tag in tags: 3 ~~

今回は、一旦変数に代入する意味が無いので、上記例では代入してませんが。

投稿2023/11/22 08:57

編集2023/11/22 09:05
otn

総合スコア85607

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwort

2023/11/24 02:01

 返信が遅くなりすみませんでした.丁寧なご回答ありがとうございます.  リスト化しているならfor文で処理すればよかったんですね.初歩的なことですみませんでした.あと.find().find_all()という記載もできることを知れてよかったです.selectによる記載のほうが単純で可読性が高そうなので今後は別回答のような記載にしようと思います.  色々な疑問が解決したので,こちらの方をベストアンサーとさせていただきます.他の方もありがとうございました.
guest

0

python

1 if res_st == None: 2 soup= BeautifulSoup(res.text.encode(res.encoding),'html.parser') 3 ###################目的のimgタグはdiv class='entry'の階層内にある 4 # img_tag= soup.find_all('img') 5 img_tag = soup.select('div.entry * img') 6 ###################

投稿2023/11/22 07:28

melian

総合スコア20455

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qwort

2023/11/24 02:07

 返信が遅くなりすみませんでした.迅速なご回答いただきありがとうございます.  selectで記載するとかなり簡単に処理できそうですね.selectの引数に関して記載方法がいまいちよくわかっていなかったので使用していませんでした.  コード記載に関してはこちらを採用させていただこうと思います.ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問