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

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

解決済

2回答

3888閲覧

複数の要素のスクレイピングと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 16:56

編集2019/01/08 16:58

前回、Webサイトからのスクレイピング&CSV出力についてご質問をさせていただき、ご回答いただいたお方のお陰で、とりあえずは1つの要素のみCSV出力できるようになったのですが、残りの4つの要素のCSV出力方法が分かりません。調べたところ、取得したい要素をそれぞれ一行で記述する必要があることまでは分かり、いろいろと試しているのですが上手く行きません。
勉強を始めたばかりで頓珍漢なご質問になるかもしれませんが、どうぞよろしくお願いいたします。

○ 情報収集したいサイトは以下になります。
リンク(Bird Fanのサイト)

○ 取得してCSVに展開したい情報

<h2><h3><h4><p><a href=">の5つです。 以下のように1行ずつ書き出し出来るようにしたいです。

=================
フォトギャラリー野鳥図鑑(身近な鳥) (←h2)
身近な鳥(スズメ大)   (←h3)
スズメ          (←h4)
スズメ目ハタオリドリ科  (←p)
全長:14.5cm 翼開長::22.5cm  (←p)
人家付近でのみ見られる。ほおに黒い斑(幼鳥ではうすい)  (←p)
"/pg/kind/ord17/fam1727/spe172702/"  (←a href=" ※フルURL表示でも可)
=================

自分なりに調べて、試行錯誤で以下を実行したのですが、<h4>の情報だけ3行も出力されてしまい行き詰っております。
更に、調べ方が足りないのかもしれませんが<a href=">を出力するコマンド(記述)が分かりません。

html

1mport csv 2import requests 3import bs4 4 5res = requests.get('https://www.birdfan.net/gallery/library/sanya_mijika.html#01') 6res.encoding = res.apparent_encoding 7soup = bs4.BeautifulSoup(res.text, "html.parser") 8elems = soup.find_all('h2') 9elems = soup.find_all('h3') 10elems = soup.find_all('h4') 11for elem in elems: 12 with open(r'C:\Users\8080A\Desktop\bird.csv','w') as csvfile: 13 writer = csv.writer(csvfile, lineterminator='\n') 14 writer.writerow([str(elem).replace("<h2>","").replace("</h2>","") for elem in elems]) 15 writer.writerow([str(elem).replace("<h3>","").replace("</h3>","") for elem in elems]) 16 writer.writerow([str(elem).replace("<h4>","").replace("</h4>","") for elem in elems])

大変恐れ入りますが、どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まずh4タグを探してh4タグから上にh2タグ、h3タグを検索
h4タグのすぐ下のpタグを検索してURLを抽出、aタグのテキストが邪魔なので削除

python

1import csv 2from urllib.parse import urljoin 3 4import requests 5from bs4 import BeautifulSoup 6 7url = 'https://www.birdfan.net/gallery/library/sanya_mijika.html' 8 9headers = { 10 'User-Agent': 11 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko' 12} 13 14r = requests.get(url, headers=headers) 15 16if r.status_code == requests.codes.ok: 17 18 soup = BeautifulSoup(r.content, 'html5lib') 19 20 with open('result.csv', 'w') as fw: 21 writer = csv.writer(fw, dialect='excel', lineterminator='\n') 22 23 for i in soup.select('h4'): 24 25 # h4より上を検索 26 h2 = i.find_previous_sibling('h2').get_text(strip=True) 27 h3 = i.find_previous_sibling('h3').get_text(strip=True) 28 29 h4 = i.get_text(strip=True) 30 31 # h4より下を検索 32 p = i.find_next_sibling('p') 33 link = urljoin(url, p.a.get('href')) 34 35 # pのaタグ削除 36 p.a.decompose() 37 38 print(h2) 39 print(h3) 40 print(h4) 41 print(p.text.strip()) 42 print(link) 43 print('-' * 20) 44 45 # CSV保存 46 writer.writerow([h2, h3, h4, p.text.strip(), link])

結果

フォトギャラリー野鳥図鑑(身近な鳥) 身近な鳥(スズメ大) スズメ スズメ目ハタオリドリ科 全長:14.5cm 翼開長:22.5cm 人家付近でのみ見られる。ほおに黒い斑(幼鳥ではうすい)。 https://www.birdfan.net/pg/kind/ord17/fam1727/spe172702/ -------------------- フォトギャラリー野鳥図鑑(身近な鳥) 身近な鳥(スズメ大) シジュウカラ スズメ目シジュウカラ科 全長:14cm 白いほお、胸から腹にネクタイ模様(太い方が雄)。 https://www.birdfan.net/pg/kind/ord17/fam1718/spe171805/ -------------------- フォトギャラリー野鳥図鑑(身近な鳥) 身近な鳥(スズメ大) カワラヒワ スズメ目アトリ科 全長:14cm 肌色で太めのくちばし、翼と尾に黄色の斑。 https://www.birdfan.net/pg/kind/ord17/fam1724/spe172402/ --------------------

投稿2019/01/09 04:34

編集2019/01/09 06:49
barobaro

総合スコア1286

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

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

8080A

2019/01/09 17:15

お教えいただきまして誠にありがとうございます。(r.content, 'html5lib')の部分の'html5lib'を'html.parser'に変更して、無事に取得できました。どうもありがとうございます。contentsの中に絞って検索という認識でしたが、あるタグを基準にして上下で分けて検索するという手法もあるのですね。勉強になります。まだ、意味の分からないところが多くありますので、お教えいただいた内容を、調べてみたいと思います。重ねてお礼申し上げます。
barobaro

2019/01/10 00:19

今回はうまくいきましたが参考にされるならcan110さんのプログラムの方がいいように思います。 自分のは毎回h2とh3を取りにいくので無駄が多いです。
guest

0

h2,h3,h4が階層構造になっているので、ソースに表現するのに混乱が見られるようです。
以下のソースを参考に処理を見直してください。

Python

1import requests 2import bs4 3res = requests.get('https://www.birdfan.net/gallery/library/sanya_mijika.html#01') 4res.encoding = res.apparent_encoding 5soup = bs4.BeautifulSoup(res.text, "html.parser") 6 7section = soup.find(id='contents').find(class_='section') 8is_in = False 9for tag in section: 10 if tag.name == 'h2': 11 h2 = tag 12 if tag.name == 'h3': 13 h3 = tag 14 if tag.name == 'h4': 15 h4 = tag 16 is_in = True 17 18 if is_in and tag.name == 'p': # h4の後のp 19 print('-----') 20 print('h2',h2.text) 21 print('h3',h3.text) 22 print('h4',h4.text) 23 print('p', tag.text) 24 print(tag.a['href']) 25 is_in = False 26 27""" 28----- 29h2 フォトギャラリー野鳥図鑑(身近な鳥) 30h3 身近な鳥(スズメ大) 31h4 スズメ 32p スズメ目ハタオリドリ科 33全長:14.5cm 翼開長:22.5cm 34人家付近でのみ見られる。ほおに黒い斑(幼鳥ではうすい)。 35スズメについて詳しくはこちらをご参照ください 36/pg/kind/ord17/fam1727/spe172702/ 37----- 38h2 フォトギャラリー野鳥図鑑(身近な鳥) 39h3 身近な鳥(スズメ大) 40h4 シジュウカラ 41p スズメ目シジュウカラ科 42全長:14cm 43白いほお、胸から腹にネクタイ模様(太い方が雄)。 44シジュウカラについて詳しくはこちらをご参照ください 45/pg/kind/ord17/fam1718/spe171805/ 46 : 47"""

投稿2019/01/09 04:18

can110

総合スコア38262

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

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

8080A

2019/01/09 17:01

お教えいただきまして誠にありがとうございます。何となくですが、部分的に少しだけ理解できたような気がします。ですが、まだ意味が分からない部分が結構あり、自分なりに調べてみたいと思います。 本当にどうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問