Извлечь данные из тега скрипта - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь очистить некоторые атрибуты с электронной коммерции веб-сайта, но данные не хранятся в html они хранятся в javascript script теге

Я пытаюсь получить productId, product, brand из script тег

import requests
from bs4 import BeautifulSoup

base_url = "https://www.myntra.com/men-formal-shirts?f=Collar%3AButton-Down%20Collar"

r = requests.get(base_url)

soup = BeautifulSoup(r.text, 'html.parser')

scripts = soup.find_all('script')[8]
scripts

Ответы [ 2 ]

3 голосов
/ 05 марта 2020
import requests
from bs4 import BeautifulSoup
import json
import pyjsparser

r = requests.get(
    "https://www.myntra.com/men-formal-shirts?f=Collar%3AButton-Down%20Collar&p=1")

soup = BeautifulSoup(r.text, 'html.parser')

script = soup.findAll("script")[8].text

tree = pyjsparser.parse(script)

print(tree.keys())
2 голосов
/ 05 марта 2020

Вы можете получить script как text и удалить window.__myx = с самого начала, и у вас будут правильные данные JSON, которые можно преобразовать в словарь Python с помощью стандартного модуля json.

И затем вы можете использовать keys и for -l oop для получения информации

import requests
from bs4 import BeautifulSoup
import json

base_url = "https://www.myntra.com/men-formal-shirts?f=Collar%3AButton-Down%20Collar"

r = requests.get(base_url)

soup = BeautifulSoup(r.text, 'html.parser')

# get .text
scripts = soup.find_all('script')[8].text

# remove window.__myx = 
script = scripts.split('=', 1)[1]

# convert to dictionary
data = json.loads(script)

for item in data['searchData']['results']['products']:
    print('product:', item['product'])
    print('productId:', item['productId'])
    print('brand:', item['brand'])
    print('---')

Результат:

product: Louis Philippe Men White & Blue Slim Fit Checked Formal Shirt
productId: 11390900
brand: Louis Philippe
---
product: Hancock Men White Slim Fit Solid Formal Shirt
productId: 7460073
brand: Hancock
---
product: INVICTUS Men Navy Slim Fit Printed Semiformal Shirt
productId: 6970620
brand: INVICTUS
---
product: next Men White Slim Fit Solid Formal Shirt
productId: 11067410
brand: next
---
product: INVICTUS Men White & Green Slim Fit Printed Semiformal Shirt
productId: 2314014
brand: INVICTUS
---
product: Dazzio Men Black Modern Slim Fit Solid Formal Shirt
productId: 3009355
brand: Dazzio
---

etc.
...