53496


食べログのサイトから営業時間を取得し、平日/土日祝をそれぞれ開始日時と終了日時に分けてcsvに出力できればと考えています。  
今の問題は

  1. 取得済みの平日/土日祝で別々のリストに入った文字列からxx:xxという時刻の文字列を取り出し出力すること。今のままだと1800みたくなってしまいます。findallで取得したものの中に":"や"～"という文字は除外されてしまうみたいです。
  2. ”～”の文字列に反応して開始時刻と終了時刻を別々に区切って出力すること。 18:00~23:00  
なら 18:00と23:00を別々のセルに

  3. 全角の文字列にも対処できるようにしたい

以上です宜しくお願いします。

[code]

    import csv
    import re
    import requests
    from bs4 import BeautifulSoup
    
    
    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
    
    
    def left(text, n):
        return text[:n]
    
    
    def right(text, n):
        return text[n:]
    
    
    def get_eachpage(url):
        response = requests.get(url)
        html = response.content
        soup = BeautifulSoup(html, "html.parser")
        tablinks = [
            "https://icotto.jp" + each.get("href")
            for each in soup.find_all("a", {"class": "p-presses-show-spot__source--image"})
        ]
        for tablink in tablinks:
            dotwleft = get_dotwlefts(tablink)
            dotwright = get_dotwrights(tablink)
            dotwleft = re.findall(r"[0-9０－９~〜:：]+", dotwleft)
            #dotwleft = "".join(re.findall("[0-9]{1}|[0-9]{2}:[0-9]{2}～[0-9]{1}|[0-9]{2}:[0-9]{2}", dotwleft))
            #dotwright = "".join(re.findall("[0-9]{1}|[0-9]{2}:[0-9]{2}~[0-9]{1}|[0-9]{2}:[0-9]{2}", dotwright))
            print(dotwleft)
            print(dotwright)
    
    
    url = "https://icotto.jp/presses/15108"
    get_eachpage(url)
    
[/code]


CC BY-SA 4.0
2019-03-17T08:50:46.093
53495
2019-03-19T03:17:14.503
2019-03-19T03:17:14.503
29826
32145
question
python python3 web-scraping beautifulsoup
取得した文字列の操作及び出力python


現在掲載されているサンプルコードだと動作しなかったため、標準的な対応方法をそれぞれについて解説します。

##
別々のリストに入った文字列からxx:xxという時刻の文字列を取り出し出力すること。今のままだと1800みたくなってしまいます。findallで取得したものの中に":"や"～"という文字は除外されてしまうみたいです。

現在コメントアウトしている正規表現が原因に見えます。例えば、 `re.findall(r"[0-9~〜:：]+", "spam18:00eggs")`
とすることで、 `:` や `〜`を含む文字列を時刻の形式で取得することができます。

## ”～”の文字列に反応して開始時刻と終了時刻を別々に区切って出力すること。 18:00~23:00なら 18:00と23:00を別々のセルに

上記の方法で取り出したあと、 `"10:00〜18:00".split("〜") => ["10:00", "18:00"]`
のように、[str.split](https://docs.python.org/ja/3/library/stdtypes.html#str.split)
を使ってみてはいかがでしょうか。

## 全角の文字列にも対処できるようにしたい

これも同様に、文字列の正規表現を `[0-9]` から `[0-9０-９]`
に拡張することで対応可能です。また、全角数字を整数に変換することは組み込み関数の `int` で可能です。

[code]

    int("３０") => 30
    
[/code]


CC BY-SA 4.0
2019-03-17T09:11:36.800
53496
2019-03-17T09:11:36.800
29826
53495
answer