如何获取嵌入在<script>中的提取字典

时间:2019-05-06 13:14:58

标签: python html dictionary beautifulsoup

我正在尝试抓取邮政编码:从div内的一部分文本中提取运输对。

我尝试使用.find来获取div,然后再次使用.find来获取其后跟的模式,以传递希望提取的文本部分。

从urllib.request
 导入urlopen作为uReq
从bs4进口BeautifulSoup作为汤
汇入
导入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'})

脚本= divcontainer.find(“脚本”)。文本

模式= re.compile(r'postalToProgramIDHash \“(。*?)\”',re.MULTILINE)

zips = re.search(样式,脚本)
 

我要提取的脚本部分:

 '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 :(得分:0)

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

例如:

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'}

答案 1 :(得分:0)

不同的方法-没有正则表达式!

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'}