Python3 веб-лом и разбор Json - PullRequest
0 голосов
/ 22 января 2019

Новое в программировании на Python. Пытаясь собрать информацию из следующего:

<script type="text/javascript"> dataLayer = [{'user.IntExt': 'External','user.UserId': '', 'app.Page': 'stores.aspx','app.siteArea': 'YPO-HM','app.Version': 'TBD','acct.storeAccount': '200315','acct.storeState': 'AL','acct.storeChain': 'TBD','acct.chainName': 'TBD','acct.NCPDP': '0140044','acct.StoreSegment': 'TBD','acct.storeId': 2068,'acct.storeName': 'Athens Pharmacy','acct.storeZipCode': '35611','acct.storeRegion': 'SOUTH','acct.storeGAUAID': '',}];(function(w, d, s, l, i){w[l] = w[l] ||[]; w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f = d.getElementsByTagName(s)[0],j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j, f);})(window, document,'script','dataLayer','GTM-NW87TKH');
  </script>

import requests
import urllib.request
import urllib
from bs4 import BeautifulSoup
from csv import writer
import csv
import json
import re


url = 'https://stores.healthmart.com/athenspharmacy/stores.aspx'
response = requests.get(url)
soupdata = BeautifulSoup(response.text,'html.parser')

data = soupdata.find('script')
p = re.compile('var dataLayer = (.*?);')
groups = dict(re.findall(p, data.text))
#json_data = json.dumps(groups)
print (groups['acct.NCPDP'], groups['acct.storeId'])

Может кто-нибудь помочь в коде, необходимом? Я хочу иметь возможность получить любую информацию из dataLayer. Вот исходный сайт: https://stores.healthmart.com/athenspharmacy/stores.aspx

1 Ответ

0 голосов
/ 22 января 2019

Когда вы выполните data = soupdata.find('script'), он вернет первый найденный тег скрипта.Вам нужно сделать find_all, а затем пройтись по этим элементам, чтобы выделить тот, который вы ищете.Затем требуется манипулировать строкой, чтобы она имела формат, который может использовать json.loads().

import requests
import urllib.request
import urllib
from bs4 import BeautifulSoup
from csv import writer
import csv
import json
import re


url = 'https://stores.healthmart.com/athenspharmacy/stores.aspx'
response = requests.get(url)
soupdata = BeautifulSoup(response.text,'html.parser')

scripts = soupdata.find_all('script')
jsonObj = None

for script in scripts:
    if 'dataLayer ='  in script.text:
        jsonStr = script.text
        jsonStr = jsonStr.split('dataLayer = [')[1]
        jsonStr = jsonStr.split('];')[0]
        jsonStr = jsonStr.replace("'", '"')
        jsonStr = ','.join(jsonStr.split(',')[0:-1]) + '}'

        jsonObj = json.loads(jsonStr)

print (jsonObj['acct.NCPDP'], jsonObj['acct.storeId'])

Вывод:

print (jsonObj['acct.NCPDP'], jsonObj['acct.storeId'])
0140044 2068
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...