Как очистить тег и извлечь информацию из определенного ключа

#python #web-scraping #beautifulsoup

#python #веб-очистка #beautifulsoup

Вопрос:

Я пытаюсь очистить информацию с сайта (первый опыт), я смог выполнить простую часть, которая извлекается из «div» с помощью SOF.

Однако вторая часть немного сложна, список содержит один элемент, который выглядит следующим образом :

 [<script class="BLABLA" type="application/json">
{"language":"fr",
"wakawaka":[{"id":2,"name":"Is Xtra Natsss"},{"id":13,"name":"BLO"},{"id":14,"name":"WAK95"}],
"store":[{"id":2,"name":"Is Xtra Nanou"},{"id":13,"name":"BLO"},{"id":14,"name":"WAK95"}]}
</script>]
 

Однако данные были подделаны, мне интересно, как я могу извлечь информацию, например, для «хранилища»?

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

Комментарии:

1. является ли это list содержащим string в вашем примере?

2. добавьте свой полный код в ссылку на сайт, который вы хотите проанализировать, элемент в вашем примере должен быть воспроизведен для правильной обработки

3. @DmitriyFialkovskiy да, это список, содержащий только один элемент

Ответ №1:

Предполагая, что вы каждый раз получаете элементы, как в вашем примере (в виде строки!), Вы можете получить store данные, например, dict следующим образом:

 lst = ['''<script class="BLABLA" type="application/json">
{"language":"fr",
"wakawaka":[{"id":2,"name":"Is Xtra Natsss"},{"id":13,"name":"BLO"},{"id":14,"name":"WAK95"}],
"store":[{"id":2,"name":"Is Xtra Nanou"},{"id":13,"name":"BLO"},{"id":14,"name":"WAK95"}]}
</script>''']


string_for_dict = lst[0][lst[0].index('"store":[')   9:lst[0].index('}]}')   1]
store_dictionary = eval(string_for_dict)
 

Результат:

 ({'id': 2, 'name': 'Is Xtra Nanou'},
 {'id': 13, 'name': 'BLO'},
 {'id': 14, 'name': 'WAK95'})
 

Что происходит:

просто режем строку по индексам, где начинается нужная часть ( "store":[ ) плюс 9 символов, которые являются длиной этой строки ( len('"store":[') ) и заканчиваются ( }]} ) плюс один символ, чтобы включить первую закрывающую скобку для соответствия dict формату eval .

eval в свою очередь, анализирует строку и возвращает вам a dict .

Комментарии:

1. Я высоко ценю ваши усилия, я немного рассмотрю ответ.

2.@Dimitriy есть идеи, как получить lat и lng из этого? long_lat_info[0].findAll("div") [<div class="distance dist-loaded" lat="66.89018540" lng="9.7390062000">17.9</div>]

3. @ombk попробуйте long_lat_info[0].findAll("div")[0]['lat'] и long_lat_info[0].findAll("div")[0]['lng']

4. да!! и все сработало! извините, что не реагирую

Ответ №2:

Альтернативный подход; если вы знаете, что у вас есть json, просто преобразуйте строку в json с помощью json.loads .

 from bs4 import BeautifulSoup
import json

html = '''<script class="BLABLA" type="application/json">
{"language":"fr",
"wakawaka":[{"id":2,"name":"Is Xtra Natsss"},{"id":13,"name":"BLO"},{"id":14,"name":"WAK95"}],
"store":[{"id":2,"name":"Is Xtra Nanou"},{"id":13,"name":"BLO"},{"id":14,"name":"WAK95"}]}
</script>'''

soup = BeautifulSoup(html, 'html.parser')
scripts = soup.find_all('script') # Using find_all to mimic data in question.
json = json.loads(scripts[0].contents[0])
for store in json['store']:
    print(store['name'])
 

Комментарии:

1. Я высоко ценю ваши усилия, я немного рассмотрю ответ.