Как распарсить строку с сайта?
Я начала делать парсер на python, используя requests и bs4. Беру данные из https://стопкоронавирус.рф/information/ чтобы получить число зараженных. Получаю строку - <cv-stats-virus :charts-data='[{"date":"30.04.2020","sick":106498,"healed":11619,"died":1073}...... (и что-то там еще).
Мой вопрос как это парсить с помощью python?
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
Алгоритм:
- Скачать страницу
- Найти и вытащить из нее значение атрибута
charts-data - Обработать значение атрибута. Это значение соответствует
json, поэтому можно им парсить
import json
import sys
from bs4 import BeautifulSoup
import requests
rs = requests.get('https://стопкоронавирус.рф/information/')
root = BeautifulSoup(rs.content, 'html.parser')
stats = root.select_one('cv-stats-virus')
if not stats:
print('Not found "cv-stats-virus"!')
sys.exit()
data = stats[':charts-data']
data = json.loads(data)
print(data)
# [{'date': '01.05.2020', 'sick': 114431, 'healed': 13220, 'died': 1169}, ...
for x in data:
print(x['date'], x['sick'], x['healed'], x['died'])
# 01.05.2020 114431 13220 1169
# 30.04.2020 106498 11619 1073
# 29.04.2020 99399 10286 972
# ...
Аналогичный алгоритм, но вместо парсинга используется регулярка:
import json
import re
import sys
import requests
rs = requests.get('https://стопкоронавирус.рф/information/')
m = re.search(":charts-data='(.+?)'", rs.text)
if not m:
print('Not found "charts-data"!')
sys.exit()
data = json.loads(m.group(1))
print(data)
# [{'date': '01.05.2020', 'sick': 114431, 'healed': 13220, 'died': 1169}, ...
Автор решения: Wairua
→ Ссылка
import requests
from bs4 import BeautifulSoup as Soup
import json
if __name__ == '__main__':
page = Soup(requests.get('https://стопкоронавирус.рф/information/').content, 'html.parser')
data = json.loads(page.find('cv-stats-virus')[':charts-data'])
print(data)
# [{'date': '01.05.2020', 'sick': 114431, 'healed': 13220, 'died': 1169}, {'date': '30.04.2020', 'sick': 106498, 'healed': 11619, 'died': 1073}, {'date': '29.04.2020', 'sick': 99399, 'healed': 10286, 'died': 972}, {'date': '28.04.2020', 'sick': 93558, 'healed': 8456, 'died': 864}, {'date': '27.04.2020', 'sick': 87147, 'healed': 7346, 'died': 794}, {'date': '26.04.2020', 'sick': 80949, 'healed': 6767, 'died': 744}, {'date': '25.04.2020', 'sick': 74588, 'healed': 6250, 'died': 681}, {'date': '24.04.2020', 'sick': 68622, 'healed': 5568, 'died': 615}, {'date': '23.04.2020', 'sick': 62773, 'healed': 4891, 'died': 555}, {'date': '22.04.2020', 'sick': 57999, 'healed': 4420, 'died': 513}, {'date': '21.04.2020', 'sick': 52763, 'healed': 3873, 'died': 456}, {'date': '20.04.2020', 'sick': 47121, 'healed': 3446, 'died': 405}, {'date': '19.04.2020', 'sick': 42853, 'healed': 3291, 'died': 361}, {'date': '18.04.2020', 'sick': 36793, 'healed': 3057, 'died': 313}, {'date': '17.04.2020', 'sick': 32008, 'healed': 2590, 'died': 273}, {'date': '16.04.2020', 'sick': 27938, 'healed': 2304, 'died': 232}, {'date': '15.04.2020', 'sick': 24490, 'healed': 1986, 'died': 198}, {'date': '14.04.2020', 'sick': 21102, 'healed': 1694, 'died': 170}, {'date': '13.04.2020', 'sick': 18328, 'healed': 1470, 'died': 148}, {'date': '12.04.2020', 'sick': 15770, 'healed': 1291, 'died': 130}, {'date': '11.04.2020', 'sick': 13584, 'healed': 1045, 'died': 106}, {'date': '10.04.2020', 'sick': 11917, 'healed': 795, 'died': 94}, {'date': '09.04.2020', 'sick': 10131, 'healed': 698, 'died': 76}, {'date': '08.04.2020', 'sick': 8672, 'healed': 580, 'died': 63}, {'date': '07.04.2020', 'sick': 7497, 'healed': 494, 'died': 58}, {'date': '06.04.2020', 'sick': 6343, 'healed': 406, 'died': 47}, {'date': '05.04.2020', 'sick': 5389, 'healed': 355, 'died': 45}, {'date': '04.04.2020', 'sick': 4731, 'healed': 333, 'died': 43}, {'date': '03.04.2020', 'sick': 4149, 'healed': 281, 'died': 34}, {'date': '02.04.2020', 'sick': 3548, 'healed': 235, 'died': 30}]