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

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

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

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

Beautiful Soup

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

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

747閲覧

青空文庫をルビ付きでスクレピングする

Flutter_kun

総合スコア27

スクレイピング

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

Beautiful Soup

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

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/07/21 04:30

編集2022/07/21 06:12

サンプル:https://www.aozora.gr.jp/cards/000329/files/18376_12100.html

質問

div main_textタグの中のコンテンツを<rb>などのタグ込みで取得したいと考えております

contentsメソッドでタグごと取得するところまではできたのですが、
リスト形式になっており、また不要な文字が混入しています。

for文でリストから取り出し、消そうとしたのですが、
タグは文字列で結合することができないみたいです。

理想の結果になるように出力したいのですが、
どうすればよいか教えていただけると助かります

※理想の出力結果は下に記載しております。

実現したいこと

  • 理想の出力結果になるような形で出力する。
  • ルビのタグ付きで取得する
  • '\r\n\u3000等、不要な改行コードなどを消す
  • txtファイルで出力する

試したこと

import requests from bs4 import BeautifulSoup import pandas as pd def get(url): //対象のページアクセスする url = url html_text = requests.get(url) soup = BeautifulSoup(html_text.content, 'html.parser') //タイトルと著者名を取得する title = soup.find('h1') author = soup.find('h2') //不要なタグを削除する soup.find('div',class_='jisage_5').decompose() //必要な情報を、タグごと取得 contents = soup.find('div', class_='main_text').contents return contents if __name__ == '__main__': str = get('https://www.aozora.gr.jp/cards/000329/files/18376_12100.html') print(str)

print(content)の結果

1[<br/>, '\n', '\n', <br/>, '\r\n\u3000むかし、むかし、あるところに、おじいさんとおばあさんがありました。まいにち、おじいさんは山へしば', <ruby><rb>刈</rb><rp>(</rp><rt>か</rt><rp>)</rp></ruby>, 'りに、おばあさんは川へ', <ruby><rb>洗濯</rb><rp>(</rp><rt>せんたく</rt><rp>)</rp></ruby>, 'に行きました。', <br/>, '\r\n\u3000ある日、おばあさんが、川のそばで、せっせと', <ruby><rb>洗濯</rb><rp>(</rp><rt>せんたく</rt><rp>)</rp></ruby>, 'をしていますと、', <ruby><rb>川上</rb><rp>(</rp><rt>かわかみ</rt><rp>)</rp></ruby>, 'から、大きな', <ruby><rb>桃</rb><rp>(</rp><rt>もも</rt><rp>)</rp></ruby>, 'が一つ、', <br/>, '\n', <div class="jisage_4" style="margin-left: 4em"> 2「ドンブラコッコ、スッコッコ。<br/> 3ドンブラコッコ、スッコッコ。」<br/>

_理想の出力結果

1桃太郎 2楠山正雄 3 4むかし、むかし、あるところに、おじいさんとおばあさんがありました。まいにち、おじいさんは山へしば', <ruby><rb>刈</rb><rp>(</rp><rt>か</rt><rp>)</rp></ruby>, 'りに、おばあさんは川へ', <ruby><rb>洗濯</rb><rp>(</rp><rt>せんたく</rt><rp>)</rp></ruby>, 'に行きました。', <br/>, 3000ある日、おばあさんが、川のそばで、せっせと', <ruby><rb>洗濯</rb><rp>(</rp><rt>せんたく</rt><rp>)</rp></ruby>, 'をしていますと、', <ruby><rb>川上</rb><rp>(</rp><rt>かわかみ</rt><rp>)</rp></ruby>, 'から、大きな', <ruby><rb>桃</rb><rp>(</rp><rt>もも</rt><rp>)</rp></ruby>, 'が一つ、', <br/>, ' 5「ドンブラコッコ、スッコッコ。<br/> 6ドンブラコッコ、スッコッコ。」<br/>

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

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

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

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

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

chirimen

2022/07/21 04:53

質問が書かれていないようです(何を質問したいのかがよくわかりません)。
Flutter_kun

2022/07/21 05:13

僕個人で利用するならいいのですが、使用する人が別なので できるだけシンプルに作りたいと考えております。 pysimpleGUIを使ってURLを入力すればtxtファイルが出力されるシステムになる予定です。
guest

回答1

0

ベストアンサー

brruby 要素はそのままで、それ以外は text を抽出する様な感じでしょうか。

python

1import requests 2from bs4 import BeautifulSoup 3import pandas as pd 4 5def get(url): 6 # 対象のページアクセスする 7 url = url 8 html_text = requests.get(url) 9 soup = BeautifulSoup(html_text.content, 'html.parser') 10 11 # タイトルと著者名を取得する 12 title = soup.find('h1').text 13 author = soup.find('h2').text 14 15 ## 必要な情報を、タグごと取得 16 contents = soup.find('div', class_='main_text') 17 contents = ''.join( 18 str(i) if i.name in ('br', 'ruby') else i.text.strip().replace('\r', '') 19 for i in contents) 20 return title, author, contents 21 22if __name__ == '__main__': 23 title, author, contents = get('https://www.aozora.gr.jp/cards/000329/files/18376_12100.html') 24 with open(f'青空文庫_{title}_{author}.txt', 'w') as f: 25 f.write(f'{title}\n') 26 f.write(f'{author}\n\n') 27 f.write(contents)

投稿2022/07/21 06:58

編集2022/07/21 08:54
melian

総合スコア19798

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

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

Flutter_kun

2022/07/21 07:04

ご回答ありがとうございます。 そんな感じです! タイトルと著者名と本文を連結して、.txtファイルに出力したいのですが、 良い方法はありそうでしょうか!
Flutter_kun

2022/07/21 07:08

<h2 class="author">芥川龍之介</h2> <br/>一<br/> 全角の”ー"というのが入っているみたいなのですが、 これの一番いい消し方を教えていただけると助かります!
melian

2022/07/21 07:20

一応、<br/>一<br/> は章名なのですが、何章まであるのか判らないですし、章名が漢数字以外のこともあるので一律に削除するのは難しいですね。。。
Flutter_kun

2022/07/21 07:23

ありがとうございます! 間違えました、これ章名でしたね。 理想の出力結果で{title}.txtファイルを出力したいのですが、 タグ同士の連結ができず苦戦しています。 良いやり方とかはありますか?
Flutter_kun

2022/07/21 08:37

pandasで出力してみたのですが、 title と author を入れることができませんでした
melian

2022/07/21 08:50

少し書き換えてみました。本文が一行になっているので理想の形とは異なっているかもしれません。
Flutter_kun

2022/07/21 09:36

ありがとうございます!できました!
Flutter_kun

2022/07/21 09:36

いつもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問