Как получить словарь извлечения, встроенный в <script> - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь почистить почтовые индексы: отправка пар из части текста в пределах деления.

Я пытался использовать .find, чтобы получить div, а затем .find снова, чтобы получить шаблон, за которым следует часть текста, с которой я хотел бы начать извлечение.

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import re
import json

my_url = 'https://www.amazon.com/Prime-FREE-Same-Day-Delivery/b?ie=UTF8&node=8729023011'

divcontainer = page_soup.find('div', attrs={'id' : 'top'})

script = divcontainer.find("script").text

pattern = re.compile(r'postalToProgramIDHash \"(.*?)\"', re.MULTILINE)

zips = re.search(pattern, script)

часть скрипта, которую я хочу извлечь:

 'postalToProgramIdHash':  {"94087":"free_same_day","11412":"free_same_day","93227":"free_same_day","75227":"free_same_day"..."84130":"free_same_day","40233":"free_same_day","27717":"free_same_day","45202":"free_same_day"},
    'marketplaceId'

Я ожидаю словарь с почтовым индексом: ключ доставки: пары значений в результате.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Другой подход - без регулярных выражений!

to_dict = script.replace('{','}').replace('"','').split('}')
final = dict(item.split(":") for item in to_dict[1].split(","))
print(final)

Выход:

{'94087': 'free_same_day', '11412': 'free_same_day', '93227': 'free_same_day', '75227': 'free_same_day', ' 84130': 'free_same_day', '40233': 'free_same_day', '27717': 'free_same_day','45202': 'free_same_day'}
0 голосов
/ 06 мая 2019

Попробуйте шаблон re.compile(r"'postalToProgramIdHash':\s*({.*?})", flags=re.MULTILINE)

Ex:

import re
import json

script = """'postalToProgramIdHash':  {"94087":"free_same_day","11412":"free_same_day","93227":"free_same_day","75227":"free_same_day", "84130":"free_same_day","40233":"free_same_day","27717":"free_same_day","45202":"free_same_day"},
    'marketplaceId'"""

pattern = re.compile(r"'postalToProgramIdHash':\s*({.*?})", flags=re.MULTILINE)

zips = re.search(pattern, script)
print(json.loads(zips.group(1)))

Выход:

{u'11412': u'free_same_day',
 u'27717': u'free_same_day',
 u'40233': u'free_same_day',
 u'45202': u'free_same_day',
 u'75227': u'free_same_day',
 u'84130': u'free_same_day',
 u'93227': u'free_same_day',
 u'94087': u'free_same_day'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...