【问题标题】:Python Beautifulsoup retrieving jsonPython Beautifulsoup 检索 json
【发布时间】:2020-12-01 17:03:21
【问题描述】:

我正在尝试使用 beautifulsoup 检索“inStockQty”json 键/值对,但遇到了问题。

到目前为止,这是我的代码:

import requests
from bs4 import BeautifulSoup

url = "https://direct.asda.com/george/men/shoes/black-leather-lace-up-oxford-shoes/GEM830406,default,pd.html?cgid=D2M1G10C13"
    user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14'
    headers = {'User-Agent': user_agent,
                   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.content, "html5lib")
    script = soup.select_one('script:contains("window.priceAvailabilityJSON")')

然后我如何找到“inStockQty”?我想过尝试解析所有的 JSON,但我不知道如何去除所有的 HTML 废话。

非常感谢

【问题讨论】:

    标签: python beautifulsoup screen-scraping


    【解决方案1】:

    试试这个:

    import json
    import requests
    from bs4 import BeautifulSoup
    
    url = "https://direct.asda.com/george/men/shoes/black-leather-lace-up-oxford-shoes/GEM830406,default,pd.html?cgid=D2M1G10C13"
    user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14'
    headers = {'User-Agent': user_agent,
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.content, "html5lib")
    
    script = soup.find(id='main-content').find('script').string
    data = script.split('window.priceAvailabilityJSON = ')[1].split(';\nlet product')[0]
    
    json_data = json.loads(data)
    
    # Output
    for product in json_data['productAvailability'].values():
        print(product['availability']['inStockQty'])
    
    
    

    【讨论】:

    • 得到这个:文件“C:\Users\sandhu\AppData\Local\Programs\Python\Python39\lib\json_init_.py”,第 346 行,加载中返回 _default_decoder.decode(s) 文件“C:\Users\sandhu\AppData\Local\Programs\Python\Python39\lib\json\decoder.py”,第 337 行,解码 obj,end = self.raw_decode(s, idx=_w(s, 0).end()) 文件“C:\Users\sandhu\AppData\Local\Programs\Python\Python39\lib\json\decoder.py”,第 353 行,在 raw_decode obj 中,end = self.scan_once(s, idx) json.decoder.JSONDecodeError: Unterminated string started at: line 319 column 21 (char 7713)
    • 我在 Linux 上,无法重现您的问题。 Сan你提供,可变数据输出?
    • pastebin.com/e4QxhtZi 是“数据”变量的转储。是不是因为,如果你看结尾,由于某种原因它缺少端括号?
    • 如果我切换到 anaconda(使用 spyder 而不是 pycharm)同样的问题
    • 我正在更新答案。尝试这个。我等你的结果
    【解决方案2】:

    试试 Selenium 来完成这项工作

    from selenium import webdriver
    driver = webdriver.Chrome(executable_path=r'C:\Program Files\ChromeDriver\chromedriver.exe')
    URL = 'https://direct.asda.com/george/men/shoes/black-leather-lace-up-oxford-shoes/GEM830406,default,pd.html?cgid=D2M1G10C13'
    
    driver.get(URL)
    
    driver.implicitly_wait(5) # wait until content is loaded
    

    调用变量,您可以访问它的内容:

    jsonData = driver.execute_script('return priceAvailabilityJSON')
    print(jsonData.get('productAvailability'))
    driver.close()
    

    输出

    {'G006386138': {'availability': {'backorderable': False, 'inStockQty': 6, 'instock': True, 'isBackorder': False, 'level': 'instock'}, 'badgesInformation': {'backorderInformation': {'backorderMessage': '', 'backorderableMessage': '', 'displayBackorderMessage': False}, 'displayLowStockBadge': False}, 'price': {'available': True, 'list': {'currency': 'EUR', 'decimalPrice': '27.0', 'formatted': '€ 27.00', 'value': 27}, 'vat': 16}}, 'G006386139': {'availability': {'backorderable': False, 'inStockQty': 2, 'instock': True, 'isBackorder': False, 'level': 'instock'}, 'badgesInformation': {'backorderInformation': {'backorderMessage': '', 'backorderableMessage': '', 'displayBackorderMessage': False}, 'displayLowStockBadge': False}, 'price': {'available': True, 'list': {'currency': 'EUR', 'decimalPrice': '27.0', 'formatted': '€ 27.00', 'value': 27}, 'vat': 16}}, 'G006386140': {'availability': {'backorderable': False, 'inStockQty': 9, 'instock': True, 'isBackorder': False, 'level': 'instock'}, 'badgesInformation': {'backorderInformation': {'backorderMessage': '', 'backorderableMessage': '', 'displayBackorderMessage': False}, 'displayLowStockBadge': False}, 'price': {'available': True, 'list': {'currency': 'EUR', 'decimalPrice': '27.0', 'formatted': '€ 27.00', 'value': 27}, 'vat': 16}}, 'G006386141': {'availability': {'backorderable': False, 'inStockQty': 5, 'instock': True, 'isBackorder': False, 'level': 'instock'}, 'badgesInformation': {'backorderInformation': {'backorderMessage': '', 'backorderableMessage': '', 'displayBackorderMessage': False}, 'displayLowStockBadge': False}, 'price': {'available': True, 'list': {'currency': 'EUR', 'decimalPrice': '27.0', 'formatted': '€ 27.00', 'value': 27}, 'vat': 16}}, 'G006386142': {'availability': {'backorderable': False, 'inStockQty': 2, 'instock': True, 'isBackorder': False, 'level': 'instock'}, 'badgesInformation': {'backorderInformation': {'backorderMessage': '', 'backorderableMessage': '', 'displayBackorderMessage': False}, 'displayLowStockBadge': False}, 'price': {'available': True, 'list': {'currency': 'EUR', 'decimalPrice': '27.0', 'formatted': '€ 27.00', 'value': 27}, 'vat': 16}}, 'G006386143': {'availability': {'backorderable': False, 'inStockQty': 28, 'instock': True, 'isBackorder': False, 'level': 'instock'}, 'badgesInformation': {'backorderInformation': {'backorderMessage': '', 'backorderableMessage': '', 'displayBackorderMessage': False}, 'displayLowStockBadge': False}, 'price': {'available': True, 'list': {'currency': 'EUR', 'decimalPrice': '27.0', 'formatted': '€ 27.00', 'value': 27}, 'vat': 16}}, 'G006386144': {'availability': {'backorderable': False, 'inStockQty': 7, 'instock': True, 'isBackorder': False, 'level': 'instock'}, 'badgesInformation': {'backorderInformation': {'backorderMessage': '', 'backorderableMessage': '', 'displayBackorderMessage': False}, 'displayLowStockBadge': False}, 'price': {'available': True, 'list': {'currency': 'EUR', 'decimalPrice': '27.0', 'formatted': '€ 27.00', 'value': 27}, 'vat': 16}}}
    

    【讨论】:

    • 这行得通,非常感谢,但想避免硒,因为它太慢了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多