Не могу вытащить красиво отформатированный контент json из какого-то грязного скрипта - PullRequest
1 голос
/ 24 мая 2019

Я написал скрипт на python, используя модуль запросов вместе с библиотекой BeautifulSoup и модулем re, чтобы получить скрипт, в котором доступно хорошо отформатированное содержимое json. Дело в том, что мне нравится использовать re, чтобы выделять ту самую часть из общего грязного сценария.

Этот скрипт находится внутри исходного кода, содержащего var masterCompanyData =.

Ссылка на сайт

Так выглядит сценарий с содержимым json (можно увидеть выполнение следующего сценария):

import re
import requests
from bs4 import BeautifulSoup

url = 'https://conference.iste.org/2019/exhibitors/floorplan.php'

r = requests.get(url)
soup = BeautifulSoup(r.text,"lxml")
script = soup.select_one("script:contains('masterCompanyData')").text
# p = re.compile(r'masterCompanyData = (.*);')
# jsonContent = p.findall(script)
# print(jsonContent)
print(script)

Манипуляции со строками, которые помогли мне узнать, что:

items = soup.select_one("script:contains('masterCompanyData = ')").text.split("masterCompanyData = ")[1].split("Holder for the current zoom value")[0].split("/**")[0].replace(";","").strip()

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

Как я могу получить этот контент JSON с помощью регулярных выражений?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Попробуйте следующее регулярное выражение

import requests
import re
import json

r = requests.get('https://conference.iste.org/2019/exhibitors/floorplan.php')
p1 = re.compile(r'var masterCompanyData = (.*?);\n\n\n', re.DOTALL)
item = p1.findall(r.text)[0]
data = json.loads(item)

Используя вашу идею:

import requests
import re
import json
from bs4 import BeautifulSoup as bs

r = requests.get('https://conference.iste.org/2019/exhibitors/floorplan.php')
p1 = re.compile(r'var masterCompanyData = (.*?);\n\n\n', re.DOTALL)
soup = bs(r.content, 'lxml')
script = soup.select_one("script:contains('masterCompanyData')").text
string = p1.findall(script)[0]
x = json.loads(string)
0 голосов
/ 24 мая 2019
import json
import requests
from bs4 import BeautifulSoup

url = 'https://conference.iste.org/2019/exhibitors/floorplan.php'

r = requests.get(url)
soup = BeautifulSoup(r.text,"lxml")
# p = re.compile(r'masterCompanyData = (.*);')
# jsonContent = p.findall(script)
# print(jsonContent)
for s in soup.findAll('script'):
    if 'var masterCompanyData' in str(s):
        finalstr = ''
        for line in str(s).split('\n'):
            if 'var masterCompanyData' in line:
                finalstr = line.split('=')[-1]
                continue
            if line[-2:] == '};' and finalstr:
                finalstr += line[:-1]
                break
            if finalstr:
                finalstr+=line
        break

finalstr теперь является строкой, содержащей желаемый JSON. Если вы хотите, вы можете сделать это после цикла:

import json
dictWithJSON = json.loads(finalstr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...