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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Beautiful Soup

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

Webサイト

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

Python

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

Q&A

解決済

1回答

792閲覧

BeautifulSoupでのスクレイプ 実行されない命令があるのにエラーがでない

Zawakita

総合スコア7

Beautiful Soup

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

Webサイト

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

Python

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

0グッド

0クリップ

投稿2020/01/17 11:47

編集2020/01/18 06:28

前提・実現したいこと

BeautifulSoupでスクレイプした結果をcsvファイルに出力したい

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

サイトは葉巻の通販サイトです。
それぞれの葉巻の各種パラメーターをスクレイプで拾おうとしています。

コードを実行するとエラーを出さずに動き続けるのですが、printされる実行結果を見ているとおかしな結果が散見されます。

例えば、理想はこのように表示されることです。

Brand: Don Diego Name: Privada No. 3 5-Pack Price: $19.15 Shape: Parejo Length: 7 Ring: 38 Binder: Dominican Republic Filler: Dominican Republic / Nicaragua Origin: Dominican Republic Wrapper Shade: Natural Wrapper Type: Connecticut Shade Strength: Mellow - Medium ------------------------------

ですが、実行結果には

Brand: Wall Street Cigar Cutters Name: Gunmetal Double-Bladed Guillotine Price: $11.99 Brand: Xikar Cigar Cutters Name: X1 Orange & Black Price: $24.95 Brand: Xikar Cigar Cutters Name: Black RoMa Craft Bottle Opener Price: $15.00 Brand: Xikar Cigar Cutters Name: X1 Calacas Price: $67.95 Brand: Cigar Savor Cigar Cutters Name: Cigar Savor Punch (Assorted Colors) Price: $26.95 Brand: Crowned Heads Luminosa Name: Churchill Price: $151.95 Brand: Palio Cigar Cutters Name: Carbon Fiber Cigar Cutter Price: $34.95

と、このように
print("------------------------------", '\n') が実行されない結果がたくさん出力されます。

表示されないパラメーターがあるのは、tryとexceptを使ってエラー回避しているので、まだわからなくもないのですが、それと関係なしにprintの実行結果が表示されず、そのうえエラーが出ない理由がわかりません。

ちなみに、try以下の長ったらしいコードの理由ですが、

実際のwebサイト上のパラメーターはこんな感じで表示されているのですが、
(参考URL https://www.jrcigars.com/item/aging-room-quattro-by-rafael-nodal/maestro-belicoso/ARQNMB.html#start=1)
葉巻のパラメーター例
商品によってはパラメーターがこんな感じで抜けているものもあります。
(参考URLhttps://www.jrcigars.com/item/cigar-samplers/three-buck-betty-sampler/THREESMP.html#start=1葉巻のパラメーター例2
どのパラメーターもクラス名が同じなので、各種パラメーターの親要素をテキスト指定して辿って、どれがどれかを判別して振り分けてました。
いくつもtryexceptを使っているのはそういうわけですが、問題の原因はここでしょうか。

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup as bs4 3import pandas as pd 4import time 5import lxml 6import re 7 8name_list =[] 9brand_list =[] 10price_list =[] 11length_list = [] 12ring_list = [] 13wrappertype_list = [] 14binder_list = [] 15filler_list = [] 16origin_list = [] 17strength_list = [] 18wrappershade_list = [] 19shape_list = [] 20 21page_num = 0 22 23while page_num <= 11320: 24 url = 'https://www.jrcigars.com/search?cgid=root&srule=best-matches&sz=20&start=' + str(page_num) 25 response = requests.get(url).text 26 time.sleep(3) 27 soup = bs4(response, 'lxml') 28 29 items = soup.find_all(class_="item-link") 30 for item in items: 31 brand = item.find(class_="item-desc1 text-bold").text.strip() 32 name = item.find(class_="item-desc2").text.strip() 33 price = item.find(class_="item-price").text.strip() 34 print("Brand:", brand, '\n', "Name:", name, '\n', "Price:", price) 35 brand_list.append(brand) 36 name_list.append(name) 37 price_list.append(price) 38 39 item_link = item.find("a").get("href") 40 41 response = requests.get("https://www.jrcigars.com/" + item_link).text 42 time.sleep(1) 43 soup = bs4(response, 'lxml') 44 45 detail = soup.find(class_="cigar-details") 46 47 try: 48 Element = detail.find("label", text=re.compile("Shape")) 49 element = Element.parent.find(class_="col-xs-7").text.strip() 50 print(Element.text.strip() + ":", element) 51 shape_list.append(element) 52 except AttributeError: 53 shape_list.append("-") 54 continue 55 56 try: 57 Length = detail.find("label", text=re.compile("Length")) 58 length = Length.parent.find(class_="col-xs-7").text.strip() 59 print(Length.text.strip() + ":", length) 60 length_list.append(length) 61 except AttributeError: 62 length_list.append("-") 63 continue 64 65 try: 66 Ring = detail.find("label", text=re.compile("Ring")) 67 ring = Ring.parent.find(class_="col-xs-7").text.strip() 68 print(Ring.text.strip() + ":", ring) 69 ring_list.append(ring) 70 except AttributeError: 71 ring_list.append("-") 72 continue 73 74 try: 75 Element = detail.find("label", text=re.compile("Binder")) 76 element = Element.parent.find(class_="col-xs-7").text.strip() 77 print(Element.text.strip() + ":", element) 78 binder_list.append(element) 79 except AttributeError: 80 binder_list.append("-") 81 continue 82 83 try: 84 Element = detail.find("label", text=re.compile("Filler")) 85 element = Element.parent.find(class_="col-xs-7").text.strip() 86 print(Element.text.strip() + ":", element) 87 filler_list.append(element) 88 except AttributeError: 89 filler_list.append("-") 90 continue 91 92 try: 93 Element = detail.find("label", text=re.compile("Origin")) 94 element = Element.parent.find(class_="col-xs-7").text.strip() 95 print(Element.text.strip() + ":", element) 96 origin_list.append(element) 97 except AttributeError: 98 origin_list.append("-") 99 continue 100 101 try: 102 Element = detail.find("label", text=re.compile("Wrapper Shade")) 103 element = Element.parent.find(class_="col-xs-7").text.strip() 104 print(Element.text.strip() + ":", element) 105 wrappershade_list.append(element) 106 except AttributeError: 107 wrappershade_list.append("-") 108 continue 109 110 try: 111 Element = detail.find("label", text=re.compile("Wrapper Type")) 112 element = Element.parent.find(class_="col-xs-7").text.strip() 113 print(Element.text.strip() + ":", element) 114 wrappertype_list.append(element) 115 except AttributeError: 116 wrappertype_list.append("-") 117 continue 118 119 try: 120 Element = detail.find("label", text=re.compile("Strength")) 121 element = Element.parent.find(class_="col-xs-7").text.strip() 122 print(Element.text.strip() + ":", element) 123 strength_list.append(element) 124 except AttributeError: 125 strength_list.append("-") 126 continue 127 128 ##このprintが表示されない! 129 print("------------------------------", '\n') 130 131 page_num += 20 132 133df = pd.DataFrame({ 134 "Brand":brand_list, 135 "Name":name_list, 136 "Price":price_list, 137 "Shape":shape_list, 138 "Length":length_list, 139 "Ring":ring_list, 140 "Binder":binder_list, 141 "Filler":filler_list, 142 "Wrapper Type":wrappertype_list, 143 "Origin":origin_list, 144 "Wrapper Shade":wrappershade_list, 145 "Strength":strength_list 146}) 147 148df.to_csv('./cigar_result.csv', encoding='utf-8-sig')

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

Google Colab

おかげさまで解決しました

ベストアンサーの方がおっしゃるとおり、continueでループ文から抜けていたために起きた問題でした。
continueをすべて削除したところ、正常に動くようになりました。
ありがとうございました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

各種パラメーターの親要素をテキスト指定して辿って、どれがどれかを判別して振り分けてました。

いくつもtryとexceptを使っているのはそういうわけですが、

ひとつ失敗すると、他を試さずにcontinueしているからでは?

投稿2020/01/17 13:19

shiracamus

総合スコア5406

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

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

Zawakita

2020/01/18 06:23

try-exceptとcontinueの役割をよく理解してませんでした。 解決しました。 ありがとうございました。
shiracamus

2020/01/18 06:25

逆に、成功したときは他を試す必要がないので何か対策が必要なのでは?
Zawakita

2020/01/18 06:40

すみません。初学者なものでおっしゃる意味をはかりかねております。 他を試す必要がないとは、他のtry-exceptは不要で、すべて1つにまとめたほうがよいということでしょうか? 教えていただけると幸いです。
shiracamus

2020/01/18 06:45

例えば Element = detail.find("label", text=re.compile("Shape")) : shape_list.append(element) が成功したとき、それ以降の try-except も試す/実行する ことになりますけど、気にしなくていいですか? 私なら、成功したときは continue して他の処理をスキップしてしまいます。 そうすると最後の print("------------------------------", '\n') は実行されなくなりますけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問