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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

2781閲覧

[python]セレニウムでスクレイピングをしてcsvに出力したい

Dadada_c.

総合スコア59

Python 3.x

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

2クリップ

投稿2019/02/06 22:41

#seleniumでスクレイプしてcsvに出力したい

指定サイトのページをスクレイプしcsvに出力したいのですが…下記の数点がうまくいきません。
何卒ご教示の程よろしくお願いします。

1.改行コードが消えない
2.CP932で出力できない

まず初めに対象コードと指定サイトです。
※sd.textはURLリストが格納されているだけです。

対象サイト:https://www.superdelivery.com/p/r/pd_p/4874875/

python

1 2import urllib.request, urllib.error 3import requests 4import csv 5import time 6import asyncio 7import codecs 8from bs4 import BeautifulSoup 9from selenium import webdriver 10 11 12 13 14def scraping(): 15with open('sd.txt') as f: 16for line in f.readlines(): 17yield line.strip() 18 19 20for target_url in scraping(): 21driver = webdriver.Chrome('chromedriver.exe') 22driver.set_window_size(1280, 720) 23 24time.sleep(2) 25driver.find_element_by_class_name('log-btn').click() 26driver.find_element_by_name('identification').send_keys('test@biglobe.ne.jp') 27driver.find_element_by_name('password').send_keys('xxxxxxx') 28driver.find_element_by_xpath('//*[@id="jsp-tiles-certification-c"]/form/div/div[1]/div[1]/div[6]/div/span/input').click() 29 30time.sleep(2) 31 32 33html = driver.page_source.encode('utf-8') 34soup = BeautifulSoup(html, 'html.parser') 35 36title = soup.find('span', class_='product-name').text.strip() 37imgage = soup.findAll('div', id='thumbImageBox') 38explaine = soup.find('table' , class_='product-comment-wrap').text.strip().replace(chr(165),"").replace('\r\n', '') 39jan =soup.find('div' , class_='co-fcgray td-jan').string.strip() 40open_price = soup.find('td' , class_='border-rt td-price01 co-pc-only co-pr5').text.strip().replace(chr(165),"") 41whole_price = soup.find('td' , class_='maker-wholesale-set-price').text.strip().replace(chr(165),"") 42size =soup.findAll('td',{'class':'co-p0'})[1].text.strip() 43attention =soup.findAll('td',{'class':'co-p0'})[2].text.strip() 44model = soup.findAll('td' , class_='tr-last co-ts-only').text.strip().replace(chr(165),"") 45 46 47 48for f in imgage: 49for link in f.findAll('img'): 50imgoutput = link.attrs['src'] 51imgurl = 'https:' + imgoutput 52 53with open('sd.csv', 'a', newline='' , encoding='UTF-8') as f: 54writer = csv.writer(f) 55writer.writerow([title,model,imgurl,explaine,jan,open_price,whole_price,size]) 56 57driver.quit()

1.改行コードが消えない
explaine、modelの部分での改行が消えません。

explaineの取得しているHTMLは下記になります。
CR?改行コードが入ってしまいテキストエディタで開いても、csvで開いても改行コードが消えていません。

html

1<div id="product_comment_sp" class="product-comment"> 2<a name="_top">大切なバッグをキズや型崩れから守りながら、コンパクトに収納!<br> 3ハンガーフック付なので、取り付け・取り外しが簡単!<br> 4両サイドがメッシュ仕様で、見やすく出し入れ+通気性にすぐれています!</a><span style="display:none;"></span> 5</div>

modelの取得しているHTMLは下記になります。
本当は、span毎に取得してCSVに出力したいですが…うまくいかず、一つのmodelとして取得してきたのですが、
最初のspanの後に改行が入ってしまいます。

html

1<td class="tr-last co-ts-only"> 2<table> 3<tbody><tr> 4<td> 5<span>SD品番:4874875S1</span> 6<span> / メーカー品番:1007802</span> 7</td> 8</tr> 9</tbody></table> 10</td>

2.CP932で出力できない
html = driver.page_source.encode('CP932')
with open('sd.csv', 'a', newline='' , encoding='CP932') as f:

としたり、encording にerrors='ignore' をしたり色々とためしたのですが、

UnicodeEncodeError: 'cp932' codec can't encode character '\u200b' in position 15033: illegal multibyte sequence

がでたり、色々なエンコードエラーがでます。。
まったく太刀打ちができません。。。

素人質問で大変申し訳ございません。。質問の仕方も悪いかと存じますが、何卒ご教示をよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

結構、時間が過ぎていますが解決していましたらご容赦を。
自分でも実行しようと思いましたが、ユーザー登録が必要なのでやりませんでした。
申し訳ありませんがそこまでするパワーはないです。

1.改行コードが消えない
この件についてですが、explaine = soup.find('table' , class_='product-comment-wrap').text.strip().replace(chr(165),"").replace('\r\n', '')
のように一気にreplaceしていますが、textをprintするなりデバッガで確認するなりして
地道に対応してみてはいかがでしょうか。

2.CP932で出力できない
この件ですが、質問者の書かれているurlのトップはUTF-8ですね。
CP932よりUTF-8の方が文字セットが大きいですから、UTF-8にある文字がCP932にないからかもしれませんね。
そうであれば、(1)事前に該当文字を適切に変換する。(2)CP932でなくUTF-8のままファイルする
などを考えてみてはいかがでしょうか。

投稿2019/02/07 14:42

ikapy

総合スコア1167

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

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

Dadada_c.

2019/02/07 22:38

お返事ありがとうございます。 1.改行コードが消えない この件についてですが、一つづつためしたのですがうまくいきませんでした。。 2.CP932で出力できない これはなんとか解決できそうです。ありがとうとざいます。
barobaro

2019/02/08 02:39

.get_text(strip=True)を使えばいいです。 explaine = soup.find('table' , class_='product-comment-wrap').get_text(strip=True).replace(chr(165),"")
Dadada_c.

2019/02/12 22:13

barobaroさま ご連絡が遅くなり申し訳ありません。ご指摘の通りできました!!本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問