Извлечение JSON из HTML с использованием BeautifulSoup Python - PullRequest
0 голосов
/ 23 января 2019

Когда я практиковался в очистке веб-страницы (требуются куки-файлы), у меня возникли проблемы с удалением данных JSON, встроенных в HTML. Вот что я сделал:

import requests from bs4
import BeautifulSoup as soup
import json

my_url = 'https://www.lazada.sg/catalog/?spm=a2o42.home.search.1.488d46b5mJGzEu&q=switch%20games&_keyori=ss&from=search_history&sugg=switch%20games_0_1'  

cookies = {
    "Hm_lpvt_7cd4710f721b473263eed1f0840391b4": "1548175412",
    "Hm_lvt_7cd4710f721b473263eed1f0840391b4": "1548140525",
    "x5sec":"7b22617365727665722d6c617a6164613b32223a223832333339343739626466613939303562613535386138333266383365326132434c4b516e65494645495474764a322b706f6d6f6941453d227d", }

ret = requests.get(my_url, cookies=cookies)
print("New Super Mario Bros" in ret.text) # True

page_soup = soup(ret.text, 'html.parser')
data = page_soup.findAll('script', {'type':'application/ld+json'})

Вывод выглядит следующим образом:

[
  <script type="application/ld+json">{
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "item": {
          "name": "Home",
          "@id": "https://www.lazada.sg/"
        },
        "@type": "ListItem",
        "position": "1"
      }
    ]
  }</script>,
  <script type="application/ld+json">{
    "@context": "https://schema.org",
    "@type": "ItemList",
    "itemListElement": [
      {
        "offers": {
          "priceCurrency": "SGD",
          "@type": "Offer",
          "price": "71.00",
          "availability": "https://schema.org/InStock"
        },
        "image": "https://sg-test-11.slatic.net/p/670a73a9613c36b2bb01555ab4092ba2.jpg",
        "@type": "Product",
        "name": "Switch: Super Mario Party [Available in Stock! Immediate Shipping]",
        "url": "https://www.lazada.sg/products/switch-super-mario-party-available-in-stock-immediate-shipping-i278269540-s429667097.html?search=1"
      },
      ...

Я пытался проследить за существующим потоком Извлечь json из html в python beautifulsoup , но застрял, вероятно, из-за другого форматирования JSON в HTML-супе. Часть, которую я вычеркиваю, содержит все различные товары на этой странице, есть ли способ, где я дополнительно вычеркиваю детали каждого товара (например, название, цена, рейтинг и т. Д.) И подсчитываю количество представленных товаров? Спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Вы можете зацикливать разбор из json после загрузки с помощью json.loads. Вся информация о продукте для этих контейнеров указана в одном теге скрипта, так что вы можете просто взять его.

import requests 
from bs4 import BeautifulSoup as soup
import json
import pandas as pd

my_url = 'https://www.lazada.sg/catalog/?spm=a2o42.home.search.1.488d46b5mJGzEu&q=switch%20games&_keyori=ss&from=search_history&sugg=switch%20games_0_1'  

cookies = {
    "Hm_lpvt_7cd4710f721b473263eed1f0840391b4": "1548175412",
    "Hm_lvt_7cd4710f721b473263eed1f0840391b4": "1548140525",
    "x5sec":"7b22617365727665722d6c617a6164613b32223a223832333339343739626466613939303562613535386138333266383365326132434c4b516e65494645495474764a322b706f6d6f6941453d227d", }

ret = requests.get(my_url, cookies=cookies)
print("New Super Mario Bros" in ret.text) # True

page_soup = soup(ret.text, 'lxml')
data = page_soup.select("[type='application/ld+json']")[1]
oJson = json.loads(data.text)["itemListElement"]
numProducts = len(oJson)
results = []

for product in oJson:
    results.append([product['name'], product['offers']['price'], product['offers']['availability'].replace('https://schema.org/', '')])  # etc......

df =  pd.DataFrame(results)
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...