Как удалить двойные кавычки из полученных данных JSON - PullRequest
0 голосов
/ 09 ноября 2019

В настоящее время я использую BeautifulSoup для очистки списков с веб-сайта вакансий и вывода данных в JSON через HTML-код сайта.

Я исправляю ошибки с помощью регулярных выражений по мере их появления, но эта конкретная проблема застряла у меня. Когда мы распаковываем листинг работы вместо того, чтобы извлекать информацию из каждого интересующего контейнера, я выбрал вместо этого извлечение данных JSON из исходного кода HTML (< script type = "application/ld+json" >). Оттуда я конвертирую результаты BeautifulSoup в строки, очищаю остатки HTML, а затем преобразую строку в JSON. Тем не менее, я столкнулся с проблемой из-за текста в списке вакансий с использованием кавычек. Поскольку фактические данные большие, я просто воспользуюсь заменой.

example_string = '{"Category_A" : "Words typed describing stuff",
                   "Category_B" : "Other words speaking more irrelevant stuff",
                   "Category_X" : "Here is where the "PROBLEM" lies"}'

Теперь вышеприведенное не будет работать в Python, но полученная мной строка, извлеченная из HTML-кода списка вакансий, довольно хороша. много в вышеуказанном формате. Когда он передается в json.loads(), он возвращает ошибку: json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 5035

Я не совсем уверен, как решить эту проблему.

РЕДАКТИРОВАТЬ Вот фактический код, приводящий к ошибке:

from bs4 import BeautifulSoup
from urllib.request import urlopen
import json, re

uClient = urlopen("http://www.ethiojobs.net/display-job/227974/Program-Manager---Mental-Health%2C-Child-Care-Gender-%26-Protection.html")
page_html = uClient.read()
uClient.close()

listing_soup = BeautifulSoup(page_html, "lxml")

json_script = listing_soup.find("script", "type":"application/ld+json"}).strings

extracted_json_str = ''.join(json_script)

## Clean up the string with regex
extracted_json_str_CLEAN1 = re.sub(pattern = r"\r+|\n+|\t+|\\l+|  |&nbsp;|amp;|\u2013|</?.{,6}>", # last is to get rid of </p> and </strong>
                                repl='', 
                                string = extracted_json_str)
extracted_json_str_CLEAN2 = re.sub(pattern = r"\\u2019",
                                repl = r"'",
                                string = extracted_json_str_CLEAN1)
extracted_json_str_CLEAN3 = re.sub(pattern=r'\u25cf',
                                repl=r" -",
                                string = extracted_json_str_CLEAN2)
extracted_json_str_CLEAN4 = re.sub(pattern=r'\\',
                                repl="",
                                string = extracted_json_str_CLEAN3)

## Convert to JSON (HERE'S WHERE THE ERROR ARISES)
json_listing = json.loads(extracted_json_str_CLEAN4)

Я знаю, что приводит к ошибке: в последнем пункте пункта 4 в описании задания ,автор использовал кавычки, когда ссылался на требуемое задание задания (т.е. «контроль качества»). То, как я собирался извлекать информацию из этих списков вакансий, простой случай, когда кто-то использует цитаты, приводит к разрушению всего моего подхода. Конечно, должен быть лучший способ создать этот сценарий без таких обязательств, как этот (а также использование регулярных выражений для исправления каждой поломки по мере их возникновения).

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

вам нужно применить escape-последовательность (\), если вы хотите использовать двойную кавычку (") в вашем значении. Итак, ваш строковый ввод в json.loads () должен выглядеть следующим образом.

example_string = '{"Category_A": "Words typed describing stuff", "Category_B": "Other words speaking more irrelevant stuff", "Category_X": "Here is where the \\"PROBLEM\\" lies"}'

json.loads может разобрать это.

0 голосов
/ 09 ноября 2019
# WHen you extracting this I think you shood make a chekc for this.
# example:
if "\"" in extraction:
    extraction = extraction.replace("\"", "\'")
print(extraction)

В этом случае вы преобразуете «из извлечения» в «Я имею в виду что-то, что вам нужно будет конвертировать, потому что python дает вам возможность использовать оба, если вы хотите использовать» внутри строки, вам нужно будет инвертировать этосимволы:

пример:

"this is a 'test'"
'this was a "test"'
"this is not a \"test\""
#in case the condition is meat
if "\"" in item:
    #use this
    item = item.replace("\"", "\'")
    #or use this
    item = item.replace("\"", "\\\"")
...