yuutyoko129
@yuutyoko129

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonのスクレイピングエラーについて教えてください。

Q&A

Closed

解決したいこと

ホットペッパーグルメのページをスクレイピングしようと思っているのですが、1ページ目はスクレイピング成功し、2ページ目以降がエラーとなって返ってきます。
解決方法を教えてください。

発生している問題・エラー

AttributeError: 'NoneType' object has no attribute 'find_all'

該当するソースコード

from time import sleep
from bs4 import BeautifulSoup
import requests

url = "https://www.hotpepper.jp/SA41/Y500/net1/bgn{}"

d_list = []

for i in range(1,3):

    target_url = url.format(i)
    print(target_url)

    r = requests.get(target_url)
    sleep(1)


    soup = BeautifulSoup(r.text,"html.parser")

    contents = soup.find("div",class_="mainContent")
    shops = contents.find_all("div",class_="shopDetailBottom")

    for shop in shops:

        shop_top = shop.find("div",class_="shopDetailCoreInner")

        store = shop_top.find("h3",class_="shopDetailStoreName")
        shop_name = store.find("a")

        money = shop_top.find("p",class_="dinnerBudget")
        acsess = shop_top.find("li",class_="shopDetailInfoAccess")
        url = "https://www.hotpepper.jp" + store.select("a")[0].get("href")
        
        d = {"shop_name":shop_name.text,"money":money.text,"acsess":acsess.text,"url":url}

        print(d)

自分で試したこと

「url = …」部分をコメントアウトするとスクレイピングできるため、恐らくurl部分でエラーが起きていると思います。

そこで、URLをテキストとして出力すれば良いかと思い、辞書に格納する部分で、「"url":url.text」としてみましたが、エラーが変わりませんでした、、。

0

2Answer

closeですが、未回答でしたので一言

次回からスクレイピングする正当な理由を述べてから質問して下さい。

ここはスクレイピングに対して過剰な反応をする方がいますので、回答すべきか、黙認すべきか、躊躇してます。多くの方が激ムズな法解釈を誤解しているのが残念です。

スクレイピングの理由の記載がなく、直接的に幇助する訳も行かないので、一般論になってしまいすみません。

さて、W3C webDriverでは1つのwebブラウザを制御するため、webブラウザとSelenium間に中継webサーバを実行します。

一方、BeautifulSoupは取得したhtmlを解析して値を取得します。

しかし、BeautifulSoupもW3C webDriverを参考にしてるのでブラウザの仕組みに左右されます。

例えばiframeはframesオブジェクト,ブラウザタグはwindowsオブジェクトにて管理されており、この切り替えるをしないかたが見受けられます。

1Like

contentsが結果見つからなかったので、noneになっているのに、
noneに対してfindallをしたのでエラーになってます。

1Like

Your answer might help someone💌