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

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

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

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

Q&A

解決済

2回答

3363閲覧

Pythonでスクレイピング:URLリストを入手→そのURLページごとにスクレイピングしたい

trey_0329

総合スコア109

Python 3.x

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

0グッド

1クリップ

投稿2019/03/22 20:45

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>

だいぶ長くなってしまいましたが、どなたかお分かりになる方、何卒よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

改行かスペースで分割して先頭のhttp:// かhttps://でURL判断するんでどーでしょう

投稿2019/03/22 20:50

y_waiwai

総合スコア87719

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

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

0

自己解決

For loopでstrにして解決しました

Python

1data = [] 2for i in range(0, num_pages + 1): 3 url = urllib.parse.urljoin(url, 'page:0'+str(i)) 4 html = urllib.request.urlopen(url).read() 5 soup = BeautifulSoup(html, 'html.parser') 6 7 for item_elems in soup.select('div.colum-right-sub-box.r_rich'): 8 #URL 9 a_elem = item_elems.select('p.clearfix a.link-blue.shop-name')[0] 10 web_url = urllib.parse.urljoin(url, a_elem.get('href')) 11 data.append(str(web_url))

投稿2019/03/24 14:42

trey_0329

総合スコア109

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問