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

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

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

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

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

Python 3.x

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

Q&A

解決済

1回答

1881閲覧

WebサイトからのスクレイピングとCSVへの出力について

8080A

総合スコア12

スクレイピング

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

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

Python 3.x

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

0グッド

0クリップ

投稿2019/01/08 01:25

編集2019/01/08 15:39

pythonの勉強を始めたばかりです。知識が不足しているため、初歩的なご質問になるかもしれませんが、どうぞよろしくお願いいたします。

前提・実現したいこと

鳥についての一覧表を作成したく、下記リンク先サイトから以下5つの情報を取り出して、最終的にCSVに展開したいと考えています。

○ リンク(Bird Fanのサイト)

○ 取得してCSVに展開したい情報
0. <h2>フォトギャラリー野鳥図鑑(身近な鳥)</h2>
0. <h3>身近な鳥(スズメ大)</h3>
0. <h4>各鳥の名前</h4>
0. <p>鳥についての説明</p>
0. <a href=">リンク先URL</a>

  • 上記1~3(<h2><h4>)の情報は、1つずつ(<h2>のみなど)であれば取得できるのですが、4と5も含め、全ての情報を一括で取得する場合の方法が分かりません。こちらのサイトで検索もしてみたのですが、前提知識が乏しいこともあり応用できそうな物を見つけられませんでした。
  • CSV出力については、他のサイトを参考に実行してみましたが出力できませんでした。
  • 複数の情報の抽出方法、<p>と<a href=>を取得するための記述、csv出力方法、この3点が分かりません。
該当のソースコード

上記リンク先のソースコードの一部です。

=================

<div class="section"> <h2>フォトギャラリー野鳥図鑑(身近な鳥)</h2> <h3><a name="01" id="01"></a>身近な鳥(スズメ大)</h3> <p><img src="/gallery/library/img_index/rz2_003.jpg" width="100" height="100" alt="" align="left" style="margin:0px 10px 5px 0px;"></p> <h4>スズメ</h4> <p>スズメ目ハタオリドリ科<br /> 全長:14.5cm 翼開長:22.5cm<br /> 人家付近でのみ見られる。ほおに黒い斑(幼鳥ではうすい)。<br /> <a href="/pg/kind/ord17/fam1727/spe172702/">スズメについて詳しくはこちらをご参照ください</a></p> <br style="clear:both;"> <p><img src="/gallery/library/img_index/rs_006.jpg" width="100" height="100" alt="" align="left" style="margin:0px 10px 5px 0px;"></p> <h4>シジュウカラ</h4> <p>スズメ目シジュウカラ科<br /> 全長:14cm<br /> 白いほお、胸から腹にネクタイ模様(太い方が雄)。<br /> <a href="/pg/kind/ord17/fam1718/spe171805/">シジュウカラについて詳しくはこちらをご参照ください</a></p> <br style="clear:both;">

=================

試したこと

以下で<h4>の情報は取得できました。
================
import requests
import bs4

res = requests.get('https://www.birdfan.net/gallery/library/sanya_mijika.html#01')
res.encoding = res.apparent_encoding
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.find_all('h4')
for elem in elems:
print(elem.getText())
================

以下でcsv出力はできませんでした。
================
import csv
import requests
import bs4

res = requests.get('https://www.birdfan.net/gallery/library/sanya_mijika.html#01')
res.encoding = res.apparent_encoding
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.find_all('h4')
for elem in elems:
with open('bird.csv', 'w',newline='') as csvfile:
writer = csv.writer(csvfile)
================

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

Windowを使用しており、取得情報に文字化けがあるため "res.encoding = res.apparent_encoding" の一文を入れました。

以上です。何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://qiita.com/okadate/items/c36f4eb9506b358fb608

私はこれで出来ました

Python

1with open(r'C:\Users\mio\Desktop\bird.csv', 'w') as csvfile: 2 writer = csv.writer(csvfile, lineterminator='\n') 3 writer.writerow([str(elem).replace("<h4>","").replace("</h4>","") for elem in elems])

投稿2019/01/08 01:53

yamato_user

総合スコア2321

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

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

8080A

2019/01/08 13:21

ご回答ありがとうございます。お教えいただいた方法で1つの要素<h4>のみCSV書き出しできました。 どうもありがとうございます。 その他の<h2>,<h3>,<p>,<a href=">につきましても同様に書き出しをしようといろいろと調べながら試行錯誤を続けているのですが、いまだに解決できずにおります。 先ずは<h3>を追加しようと思い、以下で試してみたのですがファイルは出来るもののCSV出力はできない状況です。 ===================== import csv import requests import bs4 res = requests.get('https://www.birdfan.net/gallery/library/sanya_mijika.html#01') res.encoding = res.apparent_encoding soup = bs4.BeautifulSoup(res.text, "html.parser") elems = soup.find_all("h4","h3") with open(r'C:\Users\8080A\Desktop\bird.csv', 'w') as csvfile: writer = csv.writer(csvfile, lineterminator='\n') writer.writerow([str(elem).replace("<h4>","<h3>","").replace("</h4>","</h3>","") for elem in elems]) ===================== 最終的には以下のように一行ずつCSVに出力したいのですが・・・。 ================= フォトギャラリー野鳥図鑑(身近な鳥) (←<h2>) 身近な鳥(スズメ大)   (←<h3>) スズメ          (←<h4>) スズメ目ハタオリドリ科  (←<p>) 全長:14.5cm 翼開長::22.5cm  (←<p>) 人家付近でのみ見られる。ほおに黒い斑(幼鳥ではうすい)  (←<p>) "/pg/kind/ord17/fam1727/spe172702/"  (←<a href="> ※表示はフルURLでも可) ~以下同様に続きます~ シジュウカラ スズメ目シジュウカラ科 全長:14cm 白いほお、胸から腹にネクタイ模様(太い方が雄) "pg/kind/ord17/fam1718/spe171805/" ================= 調べ方がまだ足りないのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問