#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. Я высоко ценю ваши усилия, я немного рассмотрю ответ.