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

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

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

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

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

Q&A

解決済

2回答

1000閲覧

スクレイピング <br>内のテキスト取得

KatsuTake

総合スコア9

スクレイピング

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

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

0グッド

0クリップ

投稿2020/03/24 07:00

前提・実現したいこと

jupyter notebookを使ってスクレイピングを試みています。
*初心者です。

取得したい情報は、

<tr> <td class="cell_white" valign="top" width="400"><p>(東京、一般標準タイプ、需要家渡し、1kg、90~150日手形)<br/><br/>高密度PE(粒状、一般フィルム用)   212-232円<br/>低密度PE(〃、〃)          222-252円<br/>  〃  (〃、その他用)      232-252円<br/>PP   (〃、雑貨向け)       222-262円<br/>GPPS (〃、〃)           197-213円<br/>HIPS (〃、〃)           267-287円<br/>ABS  (〃、成型用)         300-340円<br/>PA6  (〃、〃)           330-380円<br/>PA66 (〃、〃)           450-500円<br/>POM  (〃、〃)           290-320円<br/>PC   (〃、〃)          400-440円<br/>変性PPE                470-520円<br/>PBT  (〃、〃)           380-430円<br/><br/>※上記内容についてのお問合せにはお応えできませんので<br/> 悪しからずご了承ください。<br/><br/>2020年1月9日(木)日本経済新聞より</p></td> <td class="cell_white" width="200"><p></p></td> </tr> のうちの数値の部分(222-262など)です。

どのようにすれば、<br>内のテキストのみを取得できるでしょうか。
まったくの初心者ですので、お手柔らかにお願いします。

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

エラーメッセージ

該当のソースコード

import urllib.request
from bs4 import BeautifulSoup
import re

url = "http://www.daikenkasei.com/news/aydiary.php"
f = urllib.request.urlopen(url, timeout=1)
html = f.read().decode('utf-8')

soup = BeautifulSoup(html, "html.parser")

試したこと

def filter_br_pe(tag):
if tag.name == 'br' and tag.text == 'PP':
return True
return False

soup = BeautifulSoup(html, 'html.parser')
print(soup.find(filter_br_pe))

いくつかウェブを参考にトライしてみましたが、うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

KatsuTake

2020/03/25 05:31

数値の部分(222-262など)の部分を取得したと思っております。 なぜか投稿させていただいたときに、いくつか文章が欠落していました。
guest

回答2

0

ベストアンサー

数値の部分が欲しいとなると下のコードのget_price_range関数が
抽出処理をしている関数です。正規表現で抜いています。

Python

1import re 2import urllib.request 3 4from bs4 import BeautifulSoup 5 6 7def get_price_range(text): 8 price_list = re.findall("[0-9]+-[0-9]+円", text) 9 price_list = [price.strip("円").split('-') for price in price_list] 10 return [tuple(map(int, price_range)) for price_range in price_list] 11 12 13def main(): 14 url = "http://www.daikenkasei.com/news/aydiary.php" 15 f = urllib.request.urlopen(url, timeout=1) 16 html = f.read().decode('utf-8') 17 soup = BeautifulSoup(html, "html.parser") 18 19 paragraph = soup.find_all("p") 20 for p in paragraph: 21 price_list = get_price_range(p.get_text()) 22 if price_list: 23 print("=-" * 16) 24 import pprint 25 pprint.pprint(price_list) 26 27 28if __name__ == "__main__": 29 main() 30

投稿2020/03/24 11:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KatsuTake

2020/03/26 05:16

誠にありがとうございます。 書いてくださったコードを解釈することにまだ時間を要しますが、 必要な情報は取得することができました。 重ねて御礼申し上げます。
guest

0

<br/>は改行のことなので、中身という概念がありません。
HTMLを読む限り、<p>タグの中のテキストを読み込みたい、という要求かと思います。
なので、検索対象はpになります。

少し大雑把な書き方になりますが、このようにすればとりあえず取得はできると思います。

Python

1import urllib.request 2from bs4 import BeautifulSoup 3 4url = "http://www.daikenkasei.com/news/aydiary.php" 5f = urllib.request.urlopen(url, timeout=1) 6html = f.read().decode('utf-8') 7 8soup = BeautifulSoup(html, "html.parser") 9 10tags = soup.find_all("p") 11for i in tags: 12 print('text:{}'.format(i.decode_contents(formatter="html").replace('<br/>','\n')))

以下の処理でpタグを取得しています。

Python

1tags = soup.find_all("p")

もちろんこれだとpタグは全部とってきてしまうので、不要な情報も取得しているかもしれません。
その場合はtdタグを対象にするか、xpathで取得するなど、他の方法を検討されてみてはいかがでしょうか?

投稿2020/03/24 07:36

mackerel6.023

総合スコア317

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

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

KatsuTake

2020/03/26 05:20

ありがとうございます。 おかげさまで、必要なテキストをまとめて、取得することができました。 わかりやすい説明も加えてくださり、感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問