Разбор JSON из HTML с помощью Beautifulsoup - PullRequest
1 голос
/ 02 августа 2020
import json
import re

from bs4 import BeautifulSoup

data = """
<script data-hid="ld-json-ld.1551860" data-n-head="ssr" preserve="preserve" type="application/ld+json">{"@context":"http://schema.org","@type":"NewsArticle","mainEntityOfPage":{"@type":"WebPage","@id":"https://www.nzz.ch/schweiz/ploetzlich-ist-das-klimaziel-in-reichweite-ld.1551860"},"headline":"Plötzlich ist  das Klimaziel in Griffweite | NZZ","datePublished":"2020-04-15T12:33:47.623Z","dateModified":"2020-04-15T12:35:01.841Z","publisher":{"@type":"Organization","name":"Neue Zürcher Zeitung AG, Schweiz","url":"https://www.nzz.ch","logo":{"@type":"ImageObject","url":"https://www.nzz.ch/logo.png","width":413,"height":60},"contactPoint":[{"@type":"ContactPoint","telephone":"+41-44-2581000","contactType":"customer service"}],"sameAs":["https://www.facebook.com/nzz","https://www.twitter.com/nzz","https://www.youtube.com/channel/UCK1aTcR0AckQRLTlK0c4fuQ","https://www.linkedin.com/company/neue-zurcher-zeitung","https://plus.google.com/+nzz/","http://www.freebase.com/m/041b43"]},"description":"Der Ausstoss an Treibhausgasen geht nur langsam zurück. Wegen der Pandemie und der warmen Witterung könnte das Klimaziel 2020 trotzdem erfüllt werden. Der Bund aber bleibt skeptisch.","isAccessibleForFree":false,"hasPart":{"@type":"WebPageElement","isAccessibleForFree":false,"cssSelector":".regwalled"},"image":{"@type":"ImageObject","url":"https://img.nzz.ch/O=75/https://nzz-img.s3.amazonaws.com/2020/4/15/b71dc7b9-0813-4082-9bb0-a2fd28395a67.jpeg","width":"7050","height":"4705"},"author":{"@type":"Person","name":"David Vonplon"}}</script>"""

soup = BeautifulSoup(data, "html.parser")

pattern = re.compile(r"window.Rent.data\s+=\s+(\{.*?\});\n")
script = soup.find("script", text=pattern)

print(script)

Я хочу разобрать часть JSON этого кода. Но я получаю просто «Нет».

Также, если я попробую это сделать.

soup.find("script").text

Output: ''

Может ли кто-нибудь помочь мне, где я делаю ошибку?

Это упрощение более крупного кода, который все еще работал 4, 5 месяцев go, и теперь он больше не работает, и я просто не понимаю, что я делаю не так.

Большое спасибо. Марко

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Попробуйте

json.loads(soup.select_one('script').string)

и посмотрите, работает ли это. У меня это работает для <data> в вашем вопросе.

1 голос
/ 02 августа 2020

В find укажите любой атрибут script в качестве фильтра.

import json

from bs4 import BeautifulSoup

data = """
<script data-hid="ld-json-ld.1551860" data-n-head="ssr" preserve="preserve" type="application/ld+json">{"@context":"http://schema.org","@type":"NewsArticle","mainEntityOfPage":{"@type":"WebPage","@id":"https://www.nzz.ch/schweiz/ploetzlich-ist-das-klimaziel-in-reichweite-ld.1551860"},"headline":"Plötzlich ist  das Klimaziel in Griffweite | NZZ","datePublished":"2020-04-15T12:33:47.623Z","dateModified":"2020-04-15T12:35:01.841Z","publisher":{"@type":"Organization","name":"Neue Zürcher Zeitung AG, Schweiz","url":"https://www.nzz.ch","logo":{"@type":"ImageObject","url":"https://www.nzz.ch/logo.png","width":413,"height":60},"contactPoint":[{"@type":"ContactPoint","telephone":"+41-44-2581000","contactType":"customer service"}],"sameAs":["https://www.facebook.com/nzz","https://www.twitter.com/nzz","https://www.youtube.com/channel/UCK1aTcR0AckQRLTlK0c4fuQ","https://www.linkedin.com/company/neue-zurcher-zeitung","https://plus.google.com/+nzz/","http://www.freebase.com/m/041b43"]},"description":"Der Ausstoss an Treibhausgasen geht nur langsam zurück. Wegen der Pandemie und der warmen Witterung könnte das Klimaziel 2020 trotzdem erfüllt werden. Der Bund aber bleibt skeptisch.","isAccessibleForFree":false,"hasPart":{"@type":"WebPageElement","isAccessibleForFree":false,"cssSelector":".regwalled"},"image":{"@type":"ImageObject","url":"https://img.nzz.ch/O=75/https://nzz-img.s3.amazonaws.com/2020/4/15/b71dc7b9-0813-4082-9bb0-a2fd28395a67.jpeg","width":"7050","height":"4705"},"author":{"@type":"Person","name":"David Vonplon"}}</script>"""

soup = BeautifulSoup(data, "html.parser")

print(json.loads(soup.find("script", {"preserve":"preserve"}).get_text(strip=True)))

Вывод:

{'@context': 'http://schema.org', '@type': 'NewsArticle', 'mainEntityOfPage': {'@type': 'WebPage', '@id': 'https://www.nzz.ch/schweiz/ploetzlich-ist-das-klimaziel-in-reichweite-ld.1551860'}, 'headline': 'Plötzlich ist  das Klimaziel in Griffweite | NZZ', 'datePublished': '2020-04-15T12:33:47.623Z', 'dateModified': '2020-04-15T12:35:01.841Z', 'publisher': {'@type': 'Organization', 'name': 'Neue Zürcher Zeitung AG, Schweiz', 'url': 'https://www.nzz.ch', 'logo': {'@type': 'ImageObject', 'url': 'https://www.nzz.ch/logo.png', 'width': 413, 'height': 60}, 'contactPoint': [{'@type': 'ContactPoint', 'telephone': '+41-44-2581000', 'contactType': 'customer service'}], 'sameAs': ['https://www.facebook.com/nzz', 'https://www.twitter.com/nzz', 'https://www.youtube.com/channel/UCK1aTcR0AckQRLTlK0c4fuQ', 'https://www.linkedin.com/company/neue-zurcher-zeitung', 'https://plus.google.com/+nzz/', 'http://www.freebase.com/m/041b43']}, 'description': 'Der Ausstoss an Treibhausgasen geht nur langsam zurück. Wegen der Pandemie und der warmen Witterung könnte das Klimaziel 2020 trotzdem erfüllt werden. Der Bund aber bleibt skeptisch.', 'isAccessibleForFree': False, 'hasPart': {'@type': 'WebPageElement', 'isAccessibleForFree': False, 'cssSelector': '.regwalled'}, 'image': {'@type': 'ImageObject', 'url': 'https://img.nzz.ch/O=75/https://nzz-img.s3.amazonaws.com/2020/4/15/b71dc7b9-0813-4082-9bb0-a2fd28395a67.jpeg', 'width': '7050', 'height': '4705'}, 'author': {'@type': 'Person', 'name': 'David Vonplon'}}

Обновление:

По-видимому, веб-страница имеет множество тегов сценария с сохранением атрибутов. Таким образом, вы можете фильтровать по другим атрибутам.

import requests, json, re
from bs4 import BeautifulSoup

res = requests.get("https://www.nzz.ch/schweiz/ploetzlich-ist-das-klimaziel-in-reichweite-ld.1551860?reduced=true")
soup = BeautifulSoup(res.text, "html.parser")
data = json.loads(soup.find("script",attrs={"preserve":"preserve", "data-hid":re.compile("ld-json-ld*")}).get_text(strip=True))

print(data)

Вывод:

{'@context': 'http://schema.org', '@type': 'NewsArticle', 'mainEntityOfPage': {'@type': 'WebPage', '@id': 'https://www.nzz.ch/schweiz/ploetzlich-ist-das-klimaziel-in-reichweite-ld.1551860'}, 'headline': 'Plötzlich ist  das Klimaziel in Griffweite | NZZ', 'datePublished': '2020-04-15T12:33:47.623Z', 'dateModified': '2020-04-15T13:49:04.823Z', 'publisher': {'@type': 'Organization', 'name': 'Neue Zürcher Zeitung AG, Schweiz', 'url': 'https://www.nzz.ch', 'logo': {'@type': 'ImageObject', 'url': 'https://www.nzz.ch/logo.png', 'width': 413, 'height': 60}, 'contactPoint': [{'@type': 'ContactPoint', 'telephone': '+41-44-2581000', 'contactType': 'customer service'}], 'sameAs': ['https://www.facebook.com/nzz', 'https://www.twitter.com/nzz', 'https://www.youtube.com/channel/UCK1aTcR0AckQRLTlK0c4fuQ', 'https://www.linkedin.com/company/neue-zurcher-zeitung', 'https://plus.google.com/+nzz/', 'http://www.freebase.com/m/041b43']}, 'description': 'Der Ausstoss an Treibhausgasen geht nur langsam zurück. Wegen der Pandemie und der warmen Witterung könnte das Klimaziel 2020 trotzdem erfüllt werden. Der Bund aber bleibt skeptisch.', 'isAccessibleForFree': False, 'hasPart': {'@type': 'WebPageElement', 'isAccessibleForFree': False, 'cssSelector': '.regwalled'}, 'image': {'@type': 'ImageObject', 'url': 'https://img.nzz.ch/O=75/https://nzz-img.s3.amazonaws.com/2020/4/15/b71dc7b9-0813-4082-9bb0-a2fd28395a67.jpeg', 'width': '7050', 'height': '4705'}, 'author': {'@type': 'Person', 'name': 'David Vonplon'}}
...