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

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

新規登録して質問してみよう
ただいま回答率
85.47%
スクレイピング

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

Python

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

Q&A

解決済

2回答

13655閲覧

スクレイピングの時、入れ子の要素をうまく取得する方法

saita

総合スコア14

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2018/02/11 03:46

スクレイピング初心者です。教えてください。
基礎的な本を読んで次のようなhtmlタグの中身を取得する方法は理解しました。

<a>15m</a>, <a>100kg</a>

これは次のようにして2つの要素が取り出せました。

result=find_all("a") result[0].string result[1].string 実行結果-- 15m 100kg

しかしいざ実践しようとしたところ、入れ子(?)となっている要素がうまく取り出せません。

<a>15m<sup>2</sup></a>, <a>100kg</a>

同じように書くと、、

result=find_all("a") result[0].string result[1].string 実行結果-- None 100kg

となってしまいます。
<a>の中に<sup>があるからだと思うのですが。。
スマートな取り出し方を教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

コード書いてみました。
Python+BeautifulSoup4の例です。

  1. .textを用いる場合

.stringではなく.textを用いれば、期待する出力は得られるようです。

  1. unwrap()を用いてsup要素を削除

unwrap()を用いれば、要素の削除ができるようです。

Python

1from bs4 import BeautifulSoup 2 3# テスト用のHTML 4html = """ 5<a>15m<sup>2</sup></a>, 6<a>100kg</a> 7""" 8 9# 10# .textで取得する方法 11# 12# soup = BeautifulSoup(html) と書いたらWarningが出るため下記コードにする 13soup = BeautifulSoup(html, 'lxml') 14 15a_elements = soup.find_all('a') 16print(a_elements[0].text) 17# Output: 15m2 18print(a_elements[1].text) 19# Output: 100kg 20 21# 22# unwrapを用いた場合 23# 24# soup_unwrap = BeautifulSoup(html) と書いたらWarningが出るため下記コードにする 25soup_unwrap = BeautifulSoup(html, 'lxml') 26 27# unwrap処理 28for element in soup_unwrap.find_all('sup'): 29 element.unwrap() 30 31a_elements_unwrap = soup_unwrap.find_all('a') 32print(a_elements_unwrap[0].text) 33# Output: 15m2 34print(a_elements_unwrap[1].text) 35# Output: 100kg 36 37# 38# 参考 39# 40print(a_elements) 41# Output: <a>15m<sup>2</sup></a>, <a>100kg</a>] 42print(a_elements[0]) 43# Output: <a>15m<sup>2</sup></a> 44print(a_elements[1]) 45# Output: <a>100kg</a> 46 47print(a_elements_unwrap) 48# Output: [<a>15m2</a>, <a>100kg</a>] 49print(a_elements_unwrap[0]) 50# Output: <a>15m2</a> 51print(a_elements_unwrap[1]) 52# Output: <a>100kg</a>

投稿2018/02/11 05:04

編集2018/02/11 05:07
K_S_

総合スコア419

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

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

saita

2018/02/11 09:47

ありがとうございます。textにすると取れるとは。。 もう少し勉強してみます。
guest

0

BeautifulSoupの質問でしょうか?
質問文には問題が発生する最低限のソースコードと「期待する結果」を記載してくださいな。

取得したい結果コード
15m2result[0].text
15mresult[0].contents[0].string

以下はサンプルソースコードです。

Python

1# -*- coding: utf8 -*- 2from bs4 import BeautifulSoup 3 4 5def main() -> None: 6 html = """<!DOCTYPE html><head><title></title></head> 7 <body> 8 <a>15m<sup>2</sup></a>, 9 <a>100kg</a> 10 </body></html>""" 11 12 soup = BeautifulSoup(html, 'lxml') 13 result= soup.find_all("a") 14 for el in result: 15 print("#" * 20) 16 print(el.contents[0].string) 17 print(el.text) 18 print(el.string) 19 20 21if __name__ == '__main__': 22 main() 23

■参考情報
Pythonでスクレイピング 基本

投稿2018/02/11 04:58

編集2018/02/11 05:06
umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問