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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

21116閲覧

【Python3】BeautifulSoupで、入れ子のタグから情報を得る方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2018/02/21 16:56

※非エンジニア・Python初心者です。
質問の仕方が悪い場合、ご指摘いただけますと幸いです。

前提・実現したいこと

現在、htmlの中から特定の情報を取り出すプログラムを書こうと思っています。
取り出したい情報は、**htmlソース中、全ての<a>の中にある<img>**です。

例:(すごいざっくりですが)

html

1<table> 2 <body> 3 <tr> 4 <td> 5 <a href="#"><img src="A" alt=""></a> 6 <a href="#"><img src="B" alt=""></a> 7 <a href="#"><img src="C" alt=""></a> 8 </td> 9 </tr> 10 </body> 11</table>

というhtmlの場合において、取り出したいのは、
<img src="A" alt="">
<img src="B" alt="">
<img src="C" alt="">
ということになります。


入れ子のタグの中身を抽出する方法がわからなかったので、
こちらのサイトを参考にしつつ
BeautifulSoupを用いて下記のようなコードを書きました。(URLはサンプルです。)

該当のソースコード

Python

1import urllib.request 2from bs4 import BeautifulSoup 3 4html = urllib.request.urlopen("http://www.city.kashiwa.lg.jp/") 5soup = BeautifulSoup(html, "html.parser") 6 7urllist = soup.a.find_all("img") 8print(urllist)

出力結果。一番最初の<a>の中の情報しか取れなかった。

[<img alt="本文へ" src="/share/imgs/transparent.png/>"]

「aの中で入れ子になっている全てのimgを取得すること」は上記内容で解決でき、大変満足なのですが、
そもそも<a>自体がhtmlに複数ある場合はどう書いたら全部取り出せるのでしょう。

試しにsoup.find_all("a").find_all("img")
という無謀なことも書いてみましたが、当然エラーになりました。
が、思い描いているイメージとしてはそんな感じです。

この場合、どのようなコードを書いたらよいのでしょうか。どなたかご教示いただけませんか?

goma1661👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

CSSセレクタで

Python

1soup.select('a img')

とするか

Python

1[i for a in soup.find_all('a') for i in a.find_all('img')]

とするか。

投稿2018/02/22 00:16

quickquip

総合スコア11038

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

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

退会済みユーザー

退会済みユーザー

2018/02/22 12:51

本当にありがとうございます! 大変助かりました。
guest

0

soup.aはsoup.find("a")と同じで、先頭の一つのaタグしか取り込まないと、参考にされたサイトに書いてありますね。

投稿2018/02/21 18:24

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2018/02/21 22:56

コメントありがとうございます!!! そうなんですよね…情けないことに、実行してみるまで気づかなくて。。 先頭タグだけでなく全てを取り込む(find_all)して、なおかつ入れ子のタグも全て取り込む ような書き方ができないものかと調べてみているのですが、なかなか例がないようで…。 書き方次第で何かしら状況変わるのかな?と思ったのですが、そもそもBeautifulSoupでは対応してくれないのでしょうか…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問