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

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

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

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

Beautiful Soup

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

Python

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

Q&A

解決済

1回答

858閲覧

pythonで特定文字の横の要素をスクレイピングする方法

tamago_

総合スコア5

スクレイピング

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

Beautiful Soup

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

Python

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

0グッド

0クリップ

投稿2021/01/08 00:59

以下のようなhtmlから、「属性」の右側にある<a>タグの文章のみを抜き出す方法が知りたいです。

<h1>内の<a>タグのテキストは抜き出すことができたのですが、特定文字の右側を指定してスクレイピングする方法がわからず困っています。

お答えいただけますと幸いです。

現在の出力結果)
トモダチ
カイワレ
鶏肉

希望する出力結果)
トモダチ
鶏肉

html

1<h1>ホッチキス</h1> 2 <p>属性</p><a href="1" title="トモダチ">トモダチ</a> 3 <p>ホッチキスは</p><a href="2">カイワレ</a><p>のトモダチである。</p> 4<h1>はさみ</h1> 5 <p>属性</p><a href="3" title="鶏肉">鶏肉</a> 6 <p>ハサミは常にある。しかし、</p><a href="4"></a><p>とは仲が悪い。</p>

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

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

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

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

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

meg_

2021/01/08 02:29

「特定文字の右側」とはどういう意味でしょうか?
t_obara

2021/01/08 02:46

現在の出力を得たときのコードもご提示ください。
tamago_

2021/01/08 13:51

すみません。上記の「<h1>ホッチキス</h1>~仲が悪い。</p>」の例文にいただいた回答を元に、自分で形を変えて使おうと思っていますのですがうまくいきませんでした。 そのため、現在の状況と詳しい情報を追記いたします。 後出しになってしまい大変申し訳有りません。 現在書いていますコードは下記で、希望する取得結果は、 ーーーーーーーーー 杉田智和 阪口大助 釘宮理恵 ーーーーーーーーー こちらです。 html内の「声 -」の右隣りにある人物名を取得するプログラムの作成に困っています。 現在のコードでしたら、実行しても何も情報が取得できない(実行結果が空で終わり、終了する)ので、どのようにしたらいいのか止まっております。 ご回答いただけますと幸いです。 よろしくお願いいたします。 ーーー現在のコードーーーー from bs4 import BeautifulSoup url = """ <dl><dt><a href="/wiki/%E5%9D%82%E7%94%B0%E9%8A%80%E6%99%82" title="坂田銀時">坂田銀時</a>(さかた ぎんとき)</dt> <dd>声 - <a href="/wiki/%E6%9D%89%E7%94%B0%E6%99%BA%E5%92%8C" title="杉田智和">杉田智和</a>、<a href="/wiki/%E7%9F%A2%E5%8F%A3%E3%82%A2%E3%82%B5%E3%83%9F" title="矢口アサミ">矢口アサミ</a>(幼少期)、<a href="/wiki/%E6%88%B8%E6%9D%BE%E9%81%A5" title="戸松遥">戸松遥</a>(女性変身時)</dd> <dd>演 - <a href="/wiki/%E5%B0%8F%E6%A0%97%E6%97%AC" title="小栗旬">小栗旬</a><sup id="cite_ref-2" class="reference"><a href="#cite_note-2">&#91;注 1&#93;</a></sup>、<a href="/wiki/%E7%94%B0%E4%B8%AD%E6%82%A0%E5%A4%AA" title="田中悠太">田中悠太</a>(幼少期)</dd> <dd>本作の<a href="/wiki/%E4%B8%BB%E4%BA%BA%E5%85%AC" title="主人公">主人公</a>。元攘夷志士であり、かぶき町で万事屋を営む侍。</dd> <dd>攘夷戦争時代は「白夜叉」と呼ばれた。敵からは恐れられ、攘夷志士には英雄視されていた。</dd> <dt><a href="/wiki/%E5%BF%97%E6%9D%91%E6%96%B0%E5%85%AB" title="志村新八">志村新八</a>(しむら しんぱち)</dt> <dd>声 - <a href="/wiki/%E9%98%AA%E5%8F%A3%E5%A4%A7%E5%8A%A9" title="阪口大助">阪口大助</a>、<a href="/wiki/%E9%AB%98%E6%A3%AE%E5%A5%88%E6%B4%A5%E7%BE%8E" title="高森奈津美">高森奈津美</a>(幼少期)</dd> <dd>演 - <a href="/wiki/%E8%8F%85%E7%94%B0%E5%B0%86%E6%9A%89" title="菅田将暉">菅田将暉</a></dd> <dd>剣術道場の跡取りで、侍魂を学ぼうと銀時の下で働く少年。ツッコミ役で眼鏡が特徴。戦闘力は銀時らには劣るものの、日々の鍛錬などによって腕を上げ、心技ともに成長する。</dd> <dd>当初の名前は<a href="/wiki/%E6%B0%B8%E5%80%89%E6%96%B0%E5%85%AB" title="永倉新八">永倉新八</a>で、新選組のメンバーになる予定だったことが明かされている<sup id="cite_ref-3" class="reference"><a href="#cite_note-3">&#91;2&#93;</a></sup>。</dd> <dt><a href="/wiki/%E7%A5%9E%E6%A5%BD_(%E9%8A%80%E9%AD%82)" title="神楽 (銀魂)">神楽</a>(かぐら)</dt> <dd>声 - <a href="/wiki/%E9%87%98%E5%AE%AE%E7%90%86%E6%81%B5" title="釘宮理恵">釘宮理恵</a>、<a href="/wiki/%E7%9F%B3%E4%BA%95%E5%BA%B7%E5%97%A3" title="石井康嗣">石井康嗣</a>(男性変身時)</dd> <dd>演 - <a href="/wiki/%E6%A9%8B%E6%9C%AC%E7%92%B0%E5%A5%88" title="橋本環奈">橋本環奈</a></dd> <dd>本作の<a href="/wiki/%E3%83%92%E3%83%AD%E3%82%A4%E3%83%B3" title="ヒロイン">ヒロイン</a>。宇宙最強と称される夜兎族の少女。夜兎族最強とも言われる「えいりあんばすたー」星海坊主の娘。</dd> """ soup = BeautifulSoup(url,"html.parser") for s in soup.find_all('dd', text='声 - '): print(s.next_sibling.text) ーーー現在のコードーーーー
t_obara

2021/01/09 02:00

質問を編集して提示された方が回答が得られやすくなります。
tamago_

2021/01/09 05:35

ありがとうございます。 そうさせていただきます。
guest

回答1

0

ベストアンサー

こんな感じです。

python

1>>> from bs4 import BeautifulSoup 2>>> 3>>> text = '''<h1>ホッチキス</h1> 4... <p>属性</p><a href="1" title="トモダチ">トモダチ</a> 5... <p>ホッチキスは</p><a href="2">カイワレ</a><p>のトモダチである。</p> 6... <h1>はさみ</h1> 7... <p>属性</p><a href="3" title="鶏肉">鶏肉</a> 8... <p>ハサミは常にある。しかし、</p><a href="4">紙</a><p>とは仲が悪い。</p>''' 9>>> 10>>> soup = BeautifulSoup(text) 11>>> for s in soup.find_all('p', text='属性'): 12... print(s.next_sibling.text) 13... 14トモダチ 15鶏肉

投稿2021/01/08 05:30

ppaul

総合スコア24670

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

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

tamago_

2021/01/08 13:47 編集

回答ありがとうございます。早速試してみたところ、上記コードで例文からは希望通り情報を取得することができました。ありがとうございます。 しかし、下記のように書いて(ppaul様の回答を代用)実行しても実行結果に何も表示されませんでした。 「声 -」の右側の人物名だけを取得したいのですがうまく行っていません。 希望する出力結果は、 ーーーーーーーーー 杉田智和 阪口大助 釘宮理恵 ーーーーーーーーー こちらです。 ーーー現在のコードーーーー from bs4 import BeautifulSoup url = """ <dl><dt><a href="/wiki/%E5%9D%82%E7%94%B0%E9%8A%80%E6%99%82" title="坂田銀時">坂田銀時</a>(さかた ぎんとき)</dt> <dd>声 - <a href="/wiki/%E6%9D%89%E7%94%B0%E6%99%BA%E5%92%8C" title="杉田智和">杉田智和</a>、<a href="/wiki/%E7%9F%A2%E5%8F%A3%E3%82%A2%E3%82%B5%E3%83%9F" title="矢口アサミ">矢口アサミ</a>(幼少期)、<a href="/wiki/%E6%88%B8%E6%9D%BE%E9%81%A5" title="戸松遥">戸松遥</a>(女性変身時)</dd> <dd>演 - <a href="/wiki/%E5%B0%8F%E6%A0%97%E6%97%AC" title="小栗旬">小栗旬</a><sup id="cite_ref-2" class="reference"><a href="#cite_note-2">&#91;注 1&#93;</a></sup>、<a href="/wiki/%E7%94%B0%E4%B8%AD%E6%82%A0%E5%A4%AA" title="田中悠太">田中悠太</a>(幼少期)</dd> <dd>本作の<a href="/wiki/%E4%B8%BB%E4%BA%BA%E5%85%AC" title="主人公">主人公</a>。元攘夷志士であり、かぶき町で万事屋を営む侍。</dd> <dd>攘夷戦争時代は「白夜叉」と呼ばれた。敵からは恐れられ、攘夷志士には英雄視されていた。</dd> <dt><a href="/wiki/%E5%BF%97%E6%9D%91%E6%96%B0%E5%85%AB" title="志村新八">志村新八</a>(しむら しんぱち)</dt> <dd>声 - <a href="/wiki/%E9%98%AA%E5%8F%A3%E5%A4%A7%E5%8A%A9" title="阪口大助">阪口大助</a>、<a href="/wiki/%E9%AB%98%E6%A3%AE%E5%A5%88%E6%B4%A5%E7%BE%8E" title="高森奈津美">高森奈津美</a>(幼少期)</dd> <dd>演 - <a href="/wiki/%E8%8F%85%E7%94%B0%E5%B0%86%E6%9A%89" title="菅田将暉">菅田将暉</a></dd> <dd>剣術道場の跡取りで、侍魂を学ぼうと銀時の下で働く少年。ツッコミ役で眼鏡が特徴。戦闘力は銀時らには劣るものの、日々の鍛錬などによって腕を上げ、心技ともに成長する。</dd> <dd>当初の名前は<a href="/wiki/%E6%B0%B8%E5%80%89%E6%96%B0%E5%85%AB" title="永倉新八">永倉新八</a>で、新選組のメンバーになる予定だったことが明かされている<sup id="cite_ref-3" class="reference"><a href="#cite_note-3">&#91;2&#93;</a></sup>。</dd> <dt><a href="/wiki/%E7%A5%9E%E6%A5%BD_(%E9%8A%80%E9%AD%82)" title="神楽 (銀魂)">神楽</a>(かぐら)</dt> <dd>声 - <a href="/wiki/%E9%87%98%E5%AE%AE%E7%90%86%E6%81%B5" title="釘宮理恵">釘宮理恵</a>、<a href="/wiki/%E7%9F%B3%E4%BA%95%E5%BA%B7%E5%97%A3" title="石井康嗣">石井康嗣</a>(男性変身時)</dd> <dd>演 - <a href="/wiki/%E6%A9%8B%E6%9C%AC%E7%92%B0%E5%A5%88" title="橋本環奈">橋本環奈</a></dd> <dd>本作の<a href="/wiki/%E3%83%92%E3%83%AD%E3%82%A4%E3%83%B3" title="ヒロイン">ヒロイン</a>。宇宙最強と称される夜兎族の少女。夜兎族最強とも言われる「えいりあんばすたー」星海坊主の娘。</dd> """ soup = BeautifulSoup(url,"html.parser") for s in soup.find_all('dd', text='声 - '): print(s.next_sibling.text) ーーー現在のコードーーーー
ppaul

2021/01/08 14:07

BeautifulSoupが使えるようになるということは、HTMLなりXMLなりの構造を理解するということです。 最初のデータでは、求めるものは隣にありました、今回の質問のデータは求めるものは中にあります。 こういう処理は、対象のデータの構造に依存します。データの構造が変わったのですから、処理を変えなければならないのは当然です。 まず、HTMLやXMLについて勉強することをお勧めします。
tamago_

2021/01/09 08:30

すみません。私の理解力不足でした。 ご指摘くださりありがとうございます。 <dd>というタグの意味を理解せず、無関係な例文の回答をお願いしたこと大変失礼いたしました。 まずはHTMLへの理解を深め、その上で再度わからない場合に質問させていただきます。 この度は質問への解決策、今後の学習方針を提示していただきありがとうございました。
ppaul

2021/01/09 09:39

HTMLを見て、その木構造が頭の中にうかぶようになれば、実はとても簡単なことなんです。 木構造というのは https://uhyohyo.net/javascript/2_1.html にある図のようなもののことです。 一番の親(この図では上の方にあるHTML)に当たるのが、soupです。 print(soup)をやってみてください。 soupの子を取り出すのはcontentsです。この場合だと、 >>> soup.contents[0].contents[0].contents[0] <h1>ホッチキス</h1> >>> soup.contents[0].contents[0].contents[1] '\n' >>> soup.contents[0].contents[0].contents[2] <p>属性</p> >>> soup.contents[0].contents[0].contents[3] <a href="1" title="トモダチ">トモダチ</a> のようになっています。これを、木構造の絵として考えられるようになれば、Webページを作ることのできるようになりますし、BeautifulSoupも使いこなせるようになります。 next_siblingは次の子です。 >>> soup.contents[0].contents[0].contents[0].next_sibling '\n' のようなものですね、 また英語が得意ならば dir(soup) とか print(soup.find_all.__doc__) とかをやるといろいろなことが分かってきます。 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問