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

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

新規登録して質問してみよう
ただいま回答率
85.36%
Beautiful Soup

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

Q&A

解決済

2回答

695閲覧

beatifulsoupを利用したjs形式の連想配列を取得するには

temmie0527

総合スコア1

Beautiful Soup

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

0グッド

0クリップ

投稿2021/07/21 15:03

こんにちはpython諸学者です。
言葉足らずな場面もあると思いますがご容赦ください。

価格.comをWEBスクレイピングしたのですが、商品名を取得しようとした際に以下のコードを打ち込みました。

python

1import requests 2from bs4 import BeautifulSoup 3import re 4import csv 5 6 7LINK = "https://kakaku.com/item/K0001299352/pricehistory/" 8CSV_NAME = LINK.split('/')[-2] + '.csv' 9res = requests.get(LINK) 10soup = BeautifulSoup(res.content, "html.parser") 11 12 13s = soup('script')

すると以下のような結果が得られました。

<script type="text/javascript"> <!-- k3c.atrack = { ping: function(){}, val: { vc: 61, prdkey: 'K0001299352', prdname: 'PG UNLEASHED 1/60 RX-78-2 ガンダム', prdlprc: 39800, prdaprc: 39800, mkrkey: '105', mkrname: 'BANDAI', ctgkey: '6596', subctgkeys: 'V083', ctgname: 'プラモデル', shpbid: null, shpkey: null, shpname: null, shprev: null, shpvot: null, shpshp: null, shppnt: null, split: null, lxprdkey: null, cmpkey: null, brckey: null, mdlprdkey: null } }; //--> </script>
ここから、prdname:、prdkey:を取得したいのです。 様々なサイトを参考にしたのですが、jsの連想配列を取得する方法がわからず、途方に暮れております。 どうか皆様のお力をお借しください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1import requests 2from bs4 import BeautifulSoup 3import re 4import csv 5import json 6 7 8LINK = "https://kakaku.com/item/K0001299352/pricehistory/" 9CSV_NAME = LINK.split('/')[-2] + '.csv' 10res = requests.get(LINK) 11soup = BeautifulSoup(res.content, "html.parser") 12 13 14s = soup('script') 15 16 17j = re.sub('(\w+):',r'"\1":',re.search(r'(?<=val:\s)\{.*?}',s[1].get_text(),re.S).group(0)) 18j= j.replace('\'',r'"') 19 20d=json.loads(j) 21 22""" 23d['prdname'] 24 25PG UNLEASHED 1/60 RX-78-2 ガンダム 26"""

ぱっと見JSONぽかったので、チャレンジしてみました。
正規表現は

1 re.search: valを先頭にした{}内を取得
2 re.sub: JSONのキーを"で括る

となっています。
PythonのJSONデコーダーは``` ``だとダメだったのでreplaceで置換しています。

取得する項目が2つなら、正規表現でそのままとるのが早いかもしれませんね。

投稿2021/07/21 21:13

toshikawa

総合スコア388

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

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

temmie0527

2021/07/23 05:04

get_textだとNoneが返ってきたため、該当部分をstringにしたら取得できました。ありがとうございました!
guest

0

beatifulsoupだけではできないと思います。

str(s[1]) と文字列にしたうえで、正規表現で取り出せば、一応は可能です。

あとは、re --- 正規表現操作などを読んで取り出してください。

投稿2021/07/21 16:47

ppaul

総合スコア24670

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

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

temmie0527

2021/07/23 05:06

技術不足で私に開示できる情報が少ない中、とてもためになる情報をありがとうございます。リンク先拝見いたしました。正規表現はいまだにマスターできている感じがしないので、一から学習しなおそうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問