Pythonのスクレイピングでお伺いしたいです。
やりたいこと
ステップ1.店舗情報一覧が載っているサイト(https://karadarefre.jp/Search2/_find/genre:19/)
から各店舗のURLをスクレイピングし、任意の関数へ、スクレイピングしたURLをリストで格納
ステップ2.1で得たURLのリストを使い、For文を使って各店舗のページに飛んで店舗情報をスクレイピング
ステップ3.最終的に一覧サイトに載っている店舗の全ての情報をCSVに出力したい
です。
### 問題
問題1.
ステップ1について、下記コードで店舗情報のURLを得ることができましたが、どのようにリストの形で得ることができるのかわかりません。
書いたコード
Python
1import csv 2import time 3import urllib 4import urllib.request 5import numpy as np 6 7from bs4 import BeautifulSoup 8 9url = 'https://karadarefre.jp/Search2/_find/genre:19/page:0' # 取得先URL 10num_pages = 1 # 取得ページ数 11request_interval = 5 # ページ取得間隔 12 13data = [] 14for i in range(0, num_pages + 1): 15 url = urllib.parse.urljoin(url, 'page:0'+str(i)) 16 print('getting page... ', url) 17 18 html = urllib.request.urlopen(url).read() 19 soup = BeautifulSoup(html, 'html.parser') 20 21 for item_elems in soup.select('div.colum-right-sub-box.r_rich'): 22 #URL 23 a_elem = item_elems.select('p.clearfix a.link-blue.shop-name')[0] 24 web_url = urllib.parse.urljoin(url, a_elem.get('href')) 25 26 print(web_url)
出力はリストでなく、文字列になっていまいます
getting page... https://karadarefre.jp/Search2/_find/genre:19/page:00 getting page... https://karadarefre.jp/Search2/_find/genre:19/page:01 https://karadarefre.jp/facility/175427/?hold=3r https://karadarefre.jp/facility/173927/?hold=3r https://karadarefre.jp/facility/173360/?hold=3r https://karadarefre.jp/facility/176627/?hold=3r https://karadarefre.jp/facility/165530/?hold=3r https://karadarefre.jp/facility/175307/?hold=3r https://karadarefre.jp/facility/140529/?hold=3r …省略
理想の出力は下記のリストです(ステップ2のFor文で使うため)
['https://karadarefre.jp/facility/165530/?hold=3r', 'https://karadarefre.jp/facility/175307/?hold=3r', 'https://karadarefre.jp/facility/140529/?hold=3r', …省略
問題2.
ステップ2の各店舗の情報スクレイピングについて、出力CSVに余分なHTMLが含まれてしまいます。
店舗情報スクレイピングのために書いたコード(本当はこのコードをステップ1と連結して、For文を使いたいです。)
import csv import time import urllib import urllib.request import numpy as np from bs4 import BeautifulSoup request_interval = 5 # ページ取得間隔 url="https://karadarefre.jp/facility/175427/?hold=3r" data = [] print('getting page... ', url) html = urllib.request.urlopen(url).read() soup = BeautifulSoup(html, 'html.parser') for item_elems in soup.select('div.contents'): # store name name = item_elems.select('a.shop-title') # review score score = item_elems.select('span.review-point') data.append({ 'Name': name, 'Score': score, 'URL': url }) with open('output.csv', 'w', encoding='utf-8') as f: # 列の出力順序を規定 fields = ['Name', 'Score', 'URL'] writer = csv.DictWriter(f, fieldnames=fields, quoting=csv.QUOTE_NONNUMERIC) writer.writeheader() # ヘッダー出力 writer.writerows(data) # データ出力 print('complete')
上記を実行すると店舗名に余分なHTMLが含まれてしまいます。hfrefの部分がURLごとに変化するのでreplaceで除くのは難しそうです。
"[<a class=""shop-title"" href=""/facility/175427/?hold=3r"" style=""color:#595044;"">整体・ドライヘッドスパのお店、BODY PEACE 虎ノ門</a>]"
この場合、どのようにすれば店舗名だけ取り出せますでしょうか?
ちなみのこの部分のHTMLは下記の通りです。
<a href="/facility/175427/?hold=3r" class="link-blue shop-name">BODY PEACE虎ノ門</a>
だいぶ長くなってしまいましたが、どなたかお分かりになる方、何卒よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。