Как преобразовать тег BeautifulSoup в JSON? - PullRequest
0 голосов
/ 09 января 2020

У меня есть элемент type, bs4.element.Tag, продукт веб-скребка, я обычно делаю: json.loads (soup.find ('script', type = 'application / ld + json'). Text), но на этой странице он появляется только в: <script> </script>, поэтому мне пришлось делать: scripts = soup.find_all ('script'), пока я доберитесь до того, который меня интересует: script = scripts [18].

Рассматриваемая переменная script. Моя проблема в том, что я хочу получить доступ к его атрибутам, например script ['goodsInfo'], очевидно, являющийся типом элемента bs4.element.Tag, попробуйте сделать: script.attrs и вернуть мне {}. Затем я попытался преобразовать его в тип json: json.loads (str (script)), и оно выдало мне исключение : 'JSONDecodeError: Ожидаемое значение: строка 1 столбец 1 (символ 0)'

Это мой код :

import json
from bs4 import BeautifulSoup
import requests
url_aux = 'https://www.shein.com/Mock-neck-Brush-Stroke-Print-Bodycon-Dress-p-941649-cat-1727.html?scici=navbar_2~~tab01navbar04~~4~~real_1727~~~~0~~0'

response = requests.get(url_aux)
soup = BeautifulSoup(response.content, "html.parser")

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

print(json.loads(str(script)))
#output: JSONDecodeError: Expecting value: line 1 column 1 (char 0)

print(type(script))
#output: bs4.element.Tag

print(str(json.loads(str(script))))

Ответы [ 2 ]

0 голосов
/ 09 января 2020

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

Например:

import re
import json
import requests

url = 'https://eur.shein.com/Mock-neck-Brush-Stroke-Print-Bodycon-Dress-p-941649-cat-1727.html?scici=navbar_2~~tab01navbar04~~4~~real_1727~~~~0~~0&ref=www&rep=dir&ret=eur'

txt = re.findall(r'goodsInfo\s*:\s*({.*})', requests.get(url).text)[0]

data = json.loads(txt)

# print(json.dumps(data, indent=4)) # <-- uncomment to see all data

print(data['detail']['goods_name'])
print(data['detail']['brand'])
print('Num of comments:', data['detail']['comment']['comment_num'])

Отпечатки:

Mock-neck Brush Stroke Print Bodycon Dress
SHEIN
Num of comments: 17
0 голосов
/ 09 января 2020

BS4 не выполняет синтаксический анализ javascript, из POV объекта Tag объекта BS4 текст в теге <script> - это просто текст. Я понятия не имею, как выглядит этот скрипт (поскольку вы его не опубликовали, и я не собираюсь пытаться его найти), но если бы вы ожидали, что script ['goodsInfo'] вернет значение JS переменные с именем 'goodInfo', плохие новости, это не сработает.

Кроме того, Javascript не является JSON, так что вероятность того, что фрагмент JS будет действительным json довольно малы, чтобы не сказать больше. Правильный синтаксис для его проверки будет очень похож на тот, который вы использовали для первого варианта использования, ie json.loads(script.text), но я предполагаю, что это первое, что вы попробовали; -)

Итак, Боюсь, вам придется вручную проанализировать этот скрипт, чтобы извлечь соответствующую часть. В зависимости от того, как выглядит код js, это может быть вопрос нескольких строк базового c разбора строк / регулярных выражений или же может потребоваться правильный Javascript синтаксический анализатор и c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...