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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

698閲覧

CSSセレクターによるスクレイピングにおける不備

tatsuya5.22

総合スコア8

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2020/09/28 09:40

現在動的サイトのスクレイピングをしており、サイトが変わるごとに取得したい情報を持っているクラスの名前が変わってしまうため、CSSセレクターを使い情報をスクレイピングしようと試みているのですが、うまく行く時と行かない時があり不安定な状況です。

以下がコードです。必要なライブラリなどはインストール済みです。

Python

1url = "https://www.ubereats.com/jp/feed?pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMiVFNCVCQSVBQyVFOSU4MyVCRCVFNSVCOCU4MiUyMiUyQyUyMnJlZmVyZW5jZSUyMiUzQSUyMkNoSUo4Y004emRhb0FXQVJQUjI3YXpZZGxzQSUyMiUyQyUyMnJlZmVyZW5jZVR5cGUlMjIlM0ElMjJnb29nbGVfcGxhY2VzJTIyJTJDJTIybGF0aXR1ZGUlMjIlM0EzNS4wMTE1NjQlMkMlMjJsb25naXR1ZGUlMjIlM0ExMzUuNzY4MTQ4OSU3RA%3D%3D" 2 3driver = webdriver.Chrome() 4driver.get(url) 5time.sleep(5) 6 7soup = BeautifulSoup(driver.page_source,"html.parser") 8urls = soup.find_all(class_=["af fw", "af fu"]) 9url_list = ["https://www.ubereats.com" + url.a.get("href") for url in urls] 10 11for i in URL_list(): 12 driver.get(i) 13 time.sleep(3) 14 soup = BeautifulSoup(driver.page_source,"html.parser") 15 -> hours_selector = "#wrapper > div:nth-child(6) > div > div > div:nth-child(2) > div:nth-child(4) > div:nth-child(4) > table" 16 hours = soup.select_one(hours_selector).text 17 18print(hours)

矢印がついている部分で下記のエラーが起こります。
AttributeError: 'NoneType' object has no attribute 'text'

他の情報も矢印の部分と同様にCSSセレクターを使って情報をスクレイピングしているのですが問題なくスクレイピングできております。なぜかhours_selectorのコードの部分だけ毎回今回のようなエラーが起っております。

また新しいページに切り替わるたびにCSSセレクターのコードを新しくコピーし貼り付けてからスクレイピングをすると問題なくスクレイピングできます。

どなたか原因のわかる方いらっしゃいましたらご教授願います。

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

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

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

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

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

meg_

2020/09/28 11:05

> うまく行く時と行かない時があり サイトの構造が変化しているからじゃないですか?
otn

2020/09/28 11:10

単に、存在しないノードを指定しているので、Noneが返っているだけだと思います。 HTMLをよく見て、確実に取得できるようなロジックを考えましょう。
guest

回答2

0

ベストアンサー

取得対象が 解らなかったので こんな感じでしょうか?
(ご希望に添えず XPathです)

import lxml.html
追記して下さい

Python

1url = "https://www.ubereats.com/jp/feed?pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMiVFNCVCQSVBQyVFOSU4MyVCRCVFNSVCOCU4MiUyMiUyQyUyMnJlZmVyZW5jZSUyMiUzQSUyMkNoSUo4Y004emRhb0FXQVJQUjI3YXpZZGxzQSUyMiUyQyUyMnJlZmVyZW5jZVR5cGUlMjIlM0ElMjJnb29nbGVfcGxhY2VzJTIyJTJDJTIybGF0aXR1ZGUlMjIlM0EzNS4wMTE1NjQlMkMlMjJsb25naXR1ZGUlMjIlM0ExMzUuNzY4MTQ4OSU3RA%3D%3D" 2 3driver = webdriver.Chrome() 4driver.get(url) 5time.sleep(5) 6 7soup = BeautifulSoup(driver.page_source,"html.parser") 8urls = soup.find_all(class_=["af fw", "af fu"]) 9URL_list = ["https://www.ubereats.com" + url.a.get("href") for url in urls] 10 11for i in URL_list: 12 driver.get(i) 13 time.sleep(3) 14 soup = BeautifulSoup(driver.page_source,"html.parser") 15 dom = lxml.html.fromstring(driver.page_source) 16 hours_xpath = "//*[contains(text(), '所在地と営業時間')]/..//tbody//td" 17 18 hrs = dom.xpath(hours_xpath) 19 for h in hrs: 20 hours = h.text 21 if hours != None: 22 print(hours) 23 #break 24

投稿2020/09/29 10:11

編集2020/09/29 10:13
Reach

総合スコア733

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

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

0

他の情報も矢印の部分と同様にCSSセレクターを使って情報をスクレイピングしているのですが問題なくスクレイピングできております。なぜかhours_selectorのコードの部分だけ毎回今回のようなエラーが起っております。

指定URLのサイトを確認したんですが、この指定では情報が取得できない構成となっていました。
Pythonでスクレイピング(メモ10:n番目指定・思わぬ落とし穴)
スクレイピングする際は目的のタグに対してもっと明確な指定をして極力階層構造にしない事をオススメします。

投稿2020/09/28 20:36

kuma_kuma_

総合スコア2506

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問