从脚本中提取-美丽的汤

时间:2019-03-16 16:13:37

标签: python web-scraping beautifulsoup

如何从此页面的源中提取“ 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') 

4 个答案:

答案 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个元素:

  • “ tier1Category”:“药物与治疗方法”,
  • “ tier1CategoryId”:“ 359438”
  • “ 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']