52743


某有名グルメサイトのスクレイピングをpythonで試みていますが上手くいきません。  
TAB LOG

URL毎に  
・店名  
・電話番号  
・住所  
・営業時間  
を取得する予定です。

当初場所をCSSセレクターで指定していたものの、ページによって位置が若干変わってしまうようです。  
おそらく文字列（”営業時間”）を含むタグを探して、その中身を出力？のようなことでできる気がするのですが、いくら調べてもやり方がわかりません。

以下は参考までに、現時点での営業時間を取得する部分のコードですが、気にしないで貰ってかまわないです。

平日と休日を分けて出力するのを意図しています。  
tablinkにURLを入れます

ご教授宜しくお願いします

import csv  
import re  
import requests  
import pandas as pd  
from bs4 import BeautifulSoup  
def left(text, n):  
return text[:n]  
def right(text, n):  
return text[n:]  
def get_dotwlefts(tablink):  
response = requests.get(tablink)  
html = response.content  
soup = BeautifulSoup(html,"html.parser")  
dotwfound = soup.select_one("#contents-rstdata > div.rstinfo-table >
table:nth-child(2) > tbody > tr:nth-child(7) > td > p")  
if dotwfound is not None:  
dotw = dotwfound.text  
if dotwfound is None:  
dotw = ""  
m = re.search(r"[土|【土|[土・日【日|土・日|日祝|土日祝|日・祝|[日・祝|土・日・祝|土日|土、日|[金|【金|[日|金/土",
dotw, flags=re.DOTALL)  
y = m.start() if m else None  
dotwlefts = left(dotw,y)  
dotwrights = right(dotw,y)  
if dotwlefts==dotwrights:  
dotwrights = ""  
return dotwlefts  
def get_dotwrights(tablink):  
response = requests.get(tablink)  
html = response.content  
soup = BeautifulSoup(html,"html.parser")  
dotwfound = soup.select_one("#contents-rstdata > div.rstinfo-table >
table:nth-child(2) > tbody > tr:nth-child(7) > td > p")  
if dotwfound is not None:  
dotw = dotwfound.text  
if dotwfound is None:  
dotw = ""  
m = re.search(r"[土|【土|[土・日【日|土・日|日祝|土日祝|日・祝|[日・祝|土・日・祝|土日|土、日|[金|【金|[日|金/土",
dotw, flags=re.DOTALL)  
y = m.start() if m else None  
dotwlefts = left(dotw,y)  
dotwrights = right(dotw,y)  
if dotwlefts==dotwrights:  
dotwrights = ""  
return dotwrights


CC BY-SA 4.0
2019-02-12T05:36:37.227
52723
2019-02-13T08:02:17.880
32145
question
python web-scraping
python スクレイピング　営業時間の取得


紹介先情報を元にPython3で作ってみました。  
それぞれの項目をprint()で表示しているので、保存や加工したい場合は別途処理を行ってください。  
「soup_tr.th.stringのところでエラーが出た」のはencoding関連の問題と思われます。

[code]

    # -*- coding: utf-8 -*-
    import requests
    from bs4 import BeautifulSoup
    import re
    newlines = re.compile(r'\n{2,}')
    
    def scrape_info(soup_table):
      """
      基本情報の抽出
      """
      global newlines
      soup_telnum = soup_table.find("strong", class_="rstinfo-table__tel-num")
      soup_address = soup_table.find("p", class_="rstinfo-table__address")
      soup_tr_list = soup_table.find_all("tr")
      for soup_tr in soup_tr_list:
        if soup_tr.th.string in {"店名", "営業時間"}:
          item = ''
          if (soup_tr.th.string == "店名"):
            item = soup_tr.td.get_text().strip()
          else:
            item = newlines.sub("\n", soup_tr.td.get_text("\n").strip())
          print(item)
      print(soup_telnum.get_text())
      print(soup_address.get_text())
      return
    
    def scrape_item(item_url):
      """
      個別情報ページのパーシング
      """
      r = requests.get(item_url)
      if r.status_code != requests.codes.ok:
        print(f"error:not found{item_url}")
        return
      soup = BeautifulSoup(r.content, 'lxml')
      soup_table = soup.find("table", class_="rstinfo-table__table")
      scrape_info(soup_table)
      return
    
    scrape_item('https://tabelog.com/tokyo/A1303/A130301/13182370/')
    
[/code]


CC BY-SA 4.0
2019-02-13T01:57:00.653
52743
2019-02-13T08:02:17.880
2019-02-13T08:02:17.880
26370
26370
52723
answer