如何从此页面的源中提取“ tier1Category”的值? https://www.walgreens.com/store/c/walgreens-wal-zyr-24-hour-allergy-tablets/ID=prod6205762-product
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
updateMinZoomScaleForSize(view.bounds.size)
}
仅返回源的一个子集,以下内容返回该代码内的另一个源。
soup.find('script')
答案 0 :(得分:2)
这是我用来获取输出的步骤
使用 find_all 并获取第10个脚本标签。此脚本标签包含tier1Category
值。
从第一次出现的{
到最后一次出现的;
获取脚本文本。这将为我们提供适当的 json 文本。
使用json.loads
了解 json 的结构,以查找如何获取tier1Category
值。
代码:
import json
import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.walgreens.com/store/c/walgreens-wal-zyr-24-hour-allergy-tablets/ID=prod6205762-product')
soup = BeautifulSoup(r.text, 'html.parser')
script_text=soup.find_all('script')[9].text
start=str(script_text).index('{')
end=str(script_text).rindex(';')
proper_json_text=script_text[start:end]
our_json=json.loads(proper_json_text)
print(our_json['product']['results']['productInfo']['tier1Category'])
输出:
Medicines & Treatments
答案 1 :(得分:2)
Bitto和我对此有类似的方法,但是我更不想依赖于知道哪个脚本包含匹配模式,也不依赖于脚本的结构。
{{1}}
答案 2 :(得分:0)
我认为您可以使用ID。我假设第1层位于导航树中shop
之后。否则,我不会在该脚本标签中看到该值。我在普通脚本(没有script [type =“ application / ld + json”])标签中看到了它,但是第1层有很多正则表达式匹配项
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://www.walgreens.com/store/c/walgreens-wal-zyr-24-hour-allergy-tablets/ID=prod6205762-product')
soup = bs(r.content, 'lxml')
data = soup.select_one("#bdCrumbDesktopUrls_0").text
print(data)
答案 3 :(得分:0)
我不确定您需要与<script>
标签相关的确切数据元素,这确实找到了tier1Category并提取了这3个元素:
“ tier1url”:“ / store / c / medicines-and-treatments / ID = 359438-tier1”
import re
from urllib import request
from bs4 import BeautifulSoup
crawlRequest = request.urlopen('https://www.walgreens.com/store/c/walgreens-wal-zyr-24-hour-allergy-tablets/ID=prod6205762-product')
raw_html = crawlRequest
soup = BeautifulSoup(raw_html, 'lxml')
for i,tag in enumerate(soup.findAll('script')):
# There is a JSON, which could be parsed
if 'tier1Category' in tag.text:
tier_1_pattern = re.compile('(("tier1Category":"Medicines & Treatments".*)("tier1CategoryId".*)("tier1url":.*-tier1))', re.IGNORECASE|re.MULTILINE)
extract_tier_1 = re.search(tier_1_pattern, tag.text)
if extract_tier_1:
print (extract_tier_1.group(2))
# outputs
"tier1Category":"Medicines & Treatments",
print (extract_tier_1.group(3))
# outputs
"tier1CategoryId":"359438",
print (extract_tier_1.group(4))
# outputs
"tier1url":"/store/c/medicines-and-treatments/ID=359438-tier1
正如我在上一篇文章中提到的那样,有问题的脚本部分具有JSON对象,因此,该部分着重于从JSON提取上面列出的元素。 我对tier1CategoryId和URL中prodID之间的区别感到好奇。
from urllib import request
from bs4 import BeautifulSoup
import json
crawlRequest =
request.urlopen('https://www.walgreens.com/store/c/walgreens-wal-zyr-24-hour-allergy-tablets/ID=prod6205762-product')
raw_html = crawlRequest
soup = BeautifulSoup(raw_html, 'lxml')
for i,tag in enumerate(soup.findAll('script')):
if 'tier1Category' in tag.text:
json_data = json.loads(tag.text[str(tag.text).index('{'):str(tag.text).rindex(';')])
category_type = json_data['product']['results']['productInfo']['tier1Category']
category_id = json_data['product']['results']['productInfo']['tier1CategoryId']
category_url = json_data['product']['results']['productInfo']['tier1url']