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

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

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

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

Python 3.x

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

Python

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

Q&A

1回答

633閲覧

特定のHTMLデータの取得方法

aae_11

総合スコア178

Beautiful Soup

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/02/22 06:44

編集2020/02/22 06:44

HTMLのテキストデータをBeautifulSoupを使用し、取得したいのですが、うまくいかず質問させて頂きました。
イメージ説明
上記のHTMLなのですが、仮に、「dt」タグに、「業界」が存在する場合は、dd内のテキストを、「dt」にURLが存在する場合「dd」内のテキストを、といった形で「dt」タグ内に指定の文字列が存在する場合、次の行の「dd」内のテキストを取得するといった形を考えているのですが、何か良い方法はありませんでしょうか...?
どなたか、ご助言頂けましたら幸いです。

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

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

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

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

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

meg_

2020/02/22 07:40

条件分岐しない場合のコードは出来ていますか?
aae_11

2020/02/22 07:43 編集

dd内の文字列は、dtタグの文字列(業界など)によって、内容が変わって来る為、dd内の文字列の取得は条件分岐をすることを前提に考えております
meg_

2020/02/22 07:46

どこまでコードが出来ているかの確認の意で質問しました。現状の質問ですと丸投げの様に感じましたので。
aae_11

2020/02/22 07:58

なるほどです... 現状は条件分岐を前提に考えておりますので、現段階ではそこで詰まってしまっているといった状態ですね...
guest

回答1

0

もっと単純なコードでいけそうですが、以下のような感じでできます。

Python

1from bs4 import BeautifulSoup 2 3s = '<dl><dt>業界</dt><dd>説明1</dd><dd>説明2</dd><dt>URL</dt><dd><a href="https//www.example.com/">www.example.com</a></dd></dl>' 4soup = BeautifulSoup(s, 'lxml') 5 6def get_dd_text( elem, string): 7 ret = [] 8 dt = soup.find('dt', string=string) 9 if dt: 10 for s in dt.find_next_siblings(): 11 if s.name == 'dt': 12 break 13 ret.append(s.text) 14 15 return ret 16 17ret = get_dd_text( soup, '業界') 18print(ret) # ['説明1', '説明2'] 19 20ret = get_dd_text( soup, 'URL') 21print(ret) # ['www.example.com']

投稿2020/02/22 08:01

can110

総合スコア38278

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

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

aae_11

2020/02/22 08:55

ご回答ありがとうございます。 すみません。自分の質問の仕方が悪く、一部分のみしか掲載しなかったのもあり、頂いたご回答をどのように、実装すれば良いかが分からない状態でございます... 業務で扱っているコードでもあり、全て掲載する訳には行かないのですが、リンク先とコードの一部を掲載いたします為、一度チェック頂くことお願いできませんでしょうか...?
can110

2020/02/22 10:47

回答コードのどこが分からないのかを具体的に示していただければ その点についてはアドバイスできるかもしれません。
aae_11

2020/02/22 11:11 編集

ありがとうございます。 こちらなのですが、dd及びdtがある場所は、クラス「 jsDefinitionList 」な為、以下のように取得しました。 「company_info = company_page.select_one('.jsDefinitionList')」 しかし、「 s = company_info.find_next_siblings()」こちらのように記述しますと、dd,dtではなく、次のタグ部分「 [<p class="fs-12 d-n t-r pt-10 borderGray-top"> <a class="jsShowCompanyInfoCorrectionForm" href="javascript:void(0);">企業情報を修正する</a> </p>] 」が取得されてしまっているといった状況になってしまっておりまして... こちらの部分につきましての対応方法がありましたら、教えて頂ければ幸いです...
can110

2020/02/22 11:05

すみませんが、利用規約に反しているようなので対象リンクへのアドバイスはできません。
aae_11

2020/02/22 11:52

了解しました... では、頂きましたご回答内の内容から、ご質問したいのですが、「.find_next_siblings()」で取得したデータが dd,dtが存在する階層の親要素の次のタグを取得してしまう場合、代替する方法はありますでしょうか? 以下の例ですと、<p>タグ部分を取得してしまうといった状態になってしまいます... <info><dt>業界</dt><dd>IT</dd></info><p>test</p>
can110

2020/02/22 13:05

提示HTMLを回答コードで動作させてみましたが<p>タグ部分を取得してしまうという現象は再現しませんでした。 なお、これ以上この質問への回答は控えさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問