🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

Python

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

HTML

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

Q&A

解決済

2回答

3163閲覧

指定クラス内のリンク抽出方法

ishikawaman

総合スコア2

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

Python

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

HTML

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

0グッド

0クリップ

投稿2020/12/10 18:44

前提・実現したいこと

サイトのHTMLから指定クラスに紐づくURL、及びそのタイトルを抽出したいです。
お力を貸していただけると非常に助かります。

抽出したいHTML(<div class~>は不要)

<div class="クラス名"> ---<a href="URL"> ------タイトル ---</a> </div>

試したこと

cur_url = browser.current_url #URLの取得 cur_html = req.urlopen(cur_url) #HTMLの取得 soup = BeautifulSoup(cur_html,'html.parser') soup_find = soup.find_all('div', class_='クラス名') title_list = [] url_list = [] for i in soup_find : --- title_list.append(i.string) --- url_list.append(i.attrs['href'])

発生している問題・エラーメッセージ

TypeError: 'NoneType' object is not subscriptable

「url_list.append(i.attrs[href])」という行にエラーが発生しています。

同様の構成は下記のような抽出を行った後に今までも使用していましたが、問題なく動いていました。

soup_find = soup.find_all('a') title_list = [] url_list = [] for i in soup_find : --- title_list.append(i.string) --- url_list.append(i.attrs['href'])

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

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

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

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

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

guest

回答2

0

自己解決

soup_find= soup.find_all(タグ名,attrs={'class':クラス名}).find_all('a')

というコードで無事動作しました。

指定したタグ名、クラス名の該当箇所が複数存在する場合、該当箇所内での順番(0~)を指定することもできました。
soup_find= soup.find_all(タグ名,attrs={'class':クラス名})[該当箇所内での順番].find_all('a')

投稿2020/12/13 18:29

ishikawaman

総合スコア2

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

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

rysh

2020/12/13 20:30

他の回答によって解決したのに、その回答を自分で投稿してベストアンサーにするのはマナー違反では?
guest

0

hrefはaタグの属性(attr)なのでクラス指定してdivをとったあと、divの中のaを取り出してそのattrにアクセスしないといけないですよ。

投稿2020/12/11 01:05

rysh

総合スコア874

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

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

ishikawaman

2020/12/12 13:31

回答ありがとうございます。 順序だてて処理しなければならないことは理解できました。 ①「クラス指定してdivをとったあと」 ---soup_find = soup.find_all('div', class_='クラス名') ②「divの中のaを取り出して」 ---soup_find = soup.find_all('a') ③「そのattrにアクセス」 ---for i in soup_find: ------リスト名.append(i.attrs['href']) 上記のように解釈して実行してみたのですが、①の出力形式が <class 'bs4.BeautifulSoup'> → <class 'bs4.element.ResultSet'> に変換されているためか、②でエラーが発生してしまいます。 find_all を連続して実行する方法、またはデータ形式を元に戻す方法などご存じでしたらご教示いただけないでしょうか?
rysh

2020/12/13 08:19

一歩前進しましたね。 find_allで取得した結果は一つだけであってもSetというコレクションになっています。なので、リストの中から取り出すのと同じようにそこでもforで回してやれば出来そうな気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問