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

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

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

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

Beautiful Soup

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

1607閲覧

スクレイピングでタグごとにテキストを抽出したい。

Nero1129

総合スコア130

スクレイピング

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

Beautiful Soup

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/02/21 05:58

編集2020/02/21 07:54

時間がなく、焦って質問したため語弊があったので全体的に変更します。

前提・実現したいこと

スクレイピングで本文のみを抽出したい

使用するパッケージ

  • requests
  • Beautiful Soup
  • ExtractContent // 本文抽出用のパッケージ

手順

  1. requests で要求したサイトにアクセス
  2. Beautiful Soupでページ内のHTMLを取得 // ここまでは容易
  3. ExtractContentで本文を抽出 // ここで下手げに改行されたテキストが出力されるので、改行を消したい。

問題点

  1. 手順2.の後、str型に変更。

replace("\n", "")などで改行を消してから、手順3.ExtractContentに通すと、隣り合うpタグ同士が改行されず、1つの文章として出力されてしまうので、これを解消したい。(ここの質問の仕方が間違っていて語弊が生まれた模様。大変申し訳ありませんでした。)

HTML

1 <p> 2 いつもありがとうございます。 3 かなり慣れてきて、痛みを感じにくくなって 4 きました。3週間くらい持つようになって来ました。 5 また来月もよろしくお願いします。 6 </p> 7 <p> 8 いつもありがとうございます。 9 かなり慣れてきて、痛みを感じにくくなって 10 きました。3週間くらい持つようになって来ました。 11 また来月もよろしくお願いします。 12 </p>
いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。3週間くらい持つようになって来ました。また来月もよろしくお願いします。いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。3週間くらい持つようになって来ました。また来月もよろしくお願いします。

こうではなく。。。

いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。3週間くらい持つようになって来ました。また来月もよろしくお願いします。 いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。3週間くらい持つようになって来ました。また来月もよろしくお願いします。

として抽出したい。

やりたいこと。

手順2の時点で、同じタグ内だけであれば改行を消したいです。
そうすれば、ExtractContentできれいな本文が抽出できると予想。
再帰的にタグごとに改行を削除する方法を知りたいです。

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

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

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

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

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

yoorwm

2020/02/21 06:21

> すべて改行されて抽出されてしまい意味がありません タグの内容が改行されて抽出されると意味が無いという事でしょうか? > 個人的に行いたいのはタグごとにテキストを抽出出来たらな タグ毎にテキストを抽出出来ていないのですか? 説明の意味が分からないので、サンプルのHTMLドキュメントと、期待したテキスト、実際に取得されたテキストを例示してみてください。
coco_bauer

2020/02/21 06:24

何がしたいのですか???  「すべて改行されて抽出されてしまい意味がありません」って、Pタグに囲まれている文字列は改行を含んでいるので、それをスクレイピングすれば改行を含む文字列になるのが当然だと思うのですが。
quickquip

2020/02/21 06:33 編集

> 正規表現による改行、タブなどの除去を試みたのですが、すべての文字列が繋がってしまい意味がありませんでした。 「意味がありません」の意味がわからない > 1行ごとに行おうとしましたが なにをしたかわからない > そもそも入れ子構造のHTMLなのでどのように行えばいいのか なにをしたいのかわからない この調子で、「期待していること」も「期待していない動作」も「やったこと」も、なにもかもすべてが伝わってないです。 (曖昧に解釈してくれる人間にさえ伝えられないのが、プログラムが書けない原因かと感じましたが) 例えば <div>なにか<span>テキスト</span></div> という入れ子を「タグごとにテキストを抽出」するというのは、いったいどういう結果を期待しますか?
otn

2020/02/21 07:28

「タグごとにテキストを抽出」という日本語の使い方を間違えていますので、「タグごとにテキストを抽出」という言葉を使わないで書きましょう。 「タグ」が理解できてない可能性もあるので、「タグ」という言葉を使わないで書く方がいい気がします。
Nero1129

2020/02/21 07:55

焦って質問したため、語弊が生まれてしまい申し訳ありませんでした。 修正いたしましたの、ご確認よろしくお願いいたします。
guest

回答2

0

説明ではよくわからないのですがタグごとにテキストを取りたりってことでしたら

python

1html = """ 2<p> 3いつもありがとうございます。 4かなり慣れてきて、痛みを感じにくくなって 5きました。3週間くらい持つようになって来ました。 6また来月もよろしくお願いします。 7</p> 8 9<p> 10いつもありがとうございます。 11かなり慣れてきて、痛みを感じにくくなって 12きました。<b>3週間くらい持つようになって来ました。</b> 13また来月もよろしくお願いします。 14</p> 15""" 16 17from bs4 import BeautifulSoup 18 19# 改行を除去 20soup = BeautifulSoup(html.replace("\n", ""), "lxml")

タグごと改行

python

1text = soup.get_text("\n", strip=True) 2print(text)

いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。3週間くらい持つようになって来ました。また来月もよろしくお願いします。
いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。
3週間くらい持つようになって来ました。
また来月もよろしくお願いします。

タグごとにリスト

python

1text = [i for i in soup.stripped_strings] 2print(text)

['いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。3週間くらい持つようになって来ました。また来月もよろしくお願いします。',
'いつもありがとうございます。かなり慣れてきて、痛みを感じにくくなってきました。',
'3週間くらい持つようになって来ました。',
'また来月もよろしくお願いします。']

投稿2020/02/21 06:49

barobaro

総合スコア1286

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

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

0

str.replace("\n", "") で改行だけ消せばいいのではないでしょうか。

python

1html = """ 2<p> 3いつもありがとうございます。 4かなり慣れてきて、痛みを感じにくくなって 5きました。3週間くらい持つようになって来ました。 6また来月もよろしくお願いします。 7</p> 8""" 9 10from bs4 import BeautifulSoup 11 12soup = BeautifulSoup(html) 13 14text = soup.p.get_text(strip=True).replace("\n", "") 15print(text)

投稿2020/02/21 06:20

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問