1 Востаннє редагувалося mamkin haker (12.11.2021 14:03:20)

Тема: бібліотека BeautifulSoup4 парсер covid19.gov.ua

Привіт!
Ліньки завжди заходити у гугл новини чи на офіційний сайт МОЗ тому вирішив зробити такий парсер

import requests
from bs4 import BeautifulSoup as BS

if __name__ == '__main__':
    r = requests.get("https://covid19.gov.ua/")
    html = BS(r.content, 'html.parser')
    item = html.select("div.fields:nth-child(1) > .light-pink-box")

    for el in item:
        title = el.select('div:nth-child(2)')
        title = str(title).split()
        title = f"{title[2]} {title[3]}"

    item = html.select("div.fields:nth-child(1) > div.one-field:nth-child(7) > div:nth-child(1) > p:nth-child(1) > span:nth-child(1)")
    item = str(item).split()
    text_data = list(item[6])
    new_data = ''
    for t in text_data:
        if t == "<":
            break
        else:
            new_data += t

    text = item[5] + " " + new_data
    print(f"{title} нових випадків за добу\nІнформація станом на {text}.")

Цей код нікуди не годиться.
Робив чисто на вгад :D
Селектори копіював за допомогою інспектора.

свою роботу він виконує

PS C:\Users\user> & C:/Users/user/AppData/Local/Programs/Python/Python310/python.exe c:/Users/user/Desktop/pars.py
24 058 нових випадків за добу
Інформація станом на 12 листопада

але чомусь воно мене не радує =(
потім нормально перепишу

якщо порадите щось, буду вдячний

2

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

але чомусь воно мене не радує =(

Коли я стикаюся з подібною проблемою, то застосовую команду cowsay і стандартний вивід програми починає мене радувати.

Подякували: mamkin haker, Arete, leofun01, ch0r_t4

3

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

0xDADA11C7 написав:

але чомусь воно мене не радує =(

Коли я стикаюся з подібною проблемою, то застосовую команду cowsay і стандартний вивід програми починає мене радувати.

http://replace.org.ua/extensions/om_images/img/618e9c539ea22/1*-uPPC7p0uJvTFnRVOgUz3Q.jpeg

Подякували: 0xDADA11C7, leofun012

4

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

0xDADA11C7 написав:

але чомусь воно мене не радує =(

Коли я стикаюся з подібною проблемою, то застосовую команду cowsay і стандартний вивід програми починає мене радувати.

обставини покищо не дозволяють перейти на лінукс =(
(в грудні уже перейду офіційно і назавжди)

комп анексувала мама(по роботі), ноутбук тато, лишився лише мій ноутбук =(
дуал бут це погано(у віндовсі буду більше частину сидіти)
та й ігрульки для тупеньких хочеться інколи пограти

+вивід відбувається через терограм бота :3
я б з радістю вставив туди цю коровку але там пробіли якось дивно ставляться

Подякували: ch0r_t1

5

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

Ось так ніби краще, але всерівно не подобається =_=

import requests
from bs4 import BeautifulSoup

if __name__ == '__main__':
    r = requests.get("https://covid19.gov.ua/") #сайт з якого парсимо
    html = BeautifulSoup(r.content, 'html.parser')

    #кількість хворих
    item = html.select("div.fields:nth-child(1) > .light-pink-box > div:nth-child(2)")
    title = str(item).split()
    title = f"{title[2]} {title[3]}"

    #число та місяць
    item = html.select("div.one-field:nth-child(7) > div:nth-child(1) > p:nth-child(1) > span:nth-child(1)")
    text_data = str(item).split()
    number = text_data[5] #число
    text = list(text_data[6])

    #робимо з листопада</span>] => листопада
    mounth = ''
    for sumbol in text:
        if sumbol == "<": break
        mounth += sumbol

    print(f"{title} нових випадків за добу.")
    print(f"Інформація станом на {number} {mounth}.")

6

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

7-й син 7-го сина...
Там очевидно йшов масив структур (умовно) {"назва":"захворіло на добу", "значення":100500, "виділено":false}. І збирати їх треба у такі самі структури. Можна хіба що додати якусь відгадувалку за назвами. Бо інакше завтра поміняють дві комірки місцями, і ваш скрипт полетить. Адресуватися за номерами - безглуздо.

Подякували: mamkin haker1

7

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

mamkin haker написав:

та й ігрульки для тупеньких хочеться інколи пограти

https://www.protondb.com/

Просто лишу тут.

8 Востаннє редагувалося ReAl (13.11.2021 00:16:12)

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

mamkin haker написав:

+вивід відбувається через терограм бота :3
я б з радістю вставив туди цю коровку але там пробіли якось дивно ставляться

Там обмежено працює щось markdown-подібне. Треба взяти текст в ``` для використання моноширинного шрифту.

```
< Hello >
 ------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```
Подякували: 0xDADA11C7, mamkin haker, leofun013

9

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

bebyk написав:
mamkin haker написав:

та й ігрульки для тупеньких хочеться інколи пограти

https://www.protondb.com/

Просто лишу тут.

так на лінукс немає чітіков на сі ес го
AimTux баниться ваком
його форки працють через раз, і то погано
перерив увесь github)

10

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

koala написав:

7-й син 7-го сина...
Там очевидно йшов масив структур (умовно) {"назва":"захворіло на добу", "значення":100500, "виділено":false}. І збирати їх треба у такі самі структури. Можна хіба що додати якусь відгадувалку за назвами. Бо інакше завтра поміняють дві комірки місцями, і ваш скрипт полетить. Адресуватися за номерами - безглуздо.

[<div class="field-value"> 24 058 </div>] #item перший
[<span style="color: #999999;">Інформація станом на 12 листопада</span>]#item другий

ось що в item-ах
якби ось тут >Інформація і тут листопада< були пробіли ( чи їх можна добавити? ) то я б зробив, а так сумніваюсь що скоро буде меньше 1 тисячі випадків з добу тому сьогодні перероблю скориставшись вашою порадою :D

11

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

ReAl написав:
mamkin haker написав:

+вивід відбувається через терограм бота :3
я б з радістю вставив туди цю коровку але там пробіли якось дивно ставляться

Там обмежено працює щось markdown-подібне. Треба взяти текст в ``` для використання моноширинного шрифту.

```
< Hello >
 ------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```
```
23 572 нових випадків за добу.
Інформація станом на 13 листопада.
----------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\           )\/
                  ||----w |
                  ||       ||
```

непрацює (т_т)
коли я сам вводю то працює, а от коли бот то ні

12

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

mamkin haker написав:
    item = html.select("div.one-field:nth-child(7) > div:nth-child(1) > p:nth-child(1) > span:nth-child(1)")
    text_data = str(item).split()
    number = text_data[5] #число
    text = list(text_data[6])

    mounth = ''
    for sumbol in text:
        if sumbol == "<": break
        mounth += sumbol

Це такий цікавий спосіб

number, month = item[0].string.split()[-2:]

зробити?

Подякували: mamkin haker, leofun012

13

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

koala написав:
mamkin haker написав:
    item = html.select("div.one-field:nth-child(7) > div:nth-child(1) > p:nth-child(1) > span:nth-child(1)")
    text_data = str(item).split()
    number = text_data[5] #число
    text = list(text_data[6])

    mounth = ''
    for sumbol in text:
        if sumbol == "<": break
        mounth += sumbol

Це такий цікавий спосіб

number, month = item[0].string.split()[-2:]

зробити?

як :D?
а ви те довго робили?
я б до такого б точно сам недодумався :D

сам код зрозумілий, дякую :3

import requests
from bs4 import BeautifulSoup

if __name__ == '__main__':
    r = requests.get("https://covid19.gov.ua/") #сайт з якого парсимо
    html = BeautifulSoup(r.content, 'html.parser')

    #кількість хворих
    item = html.select("div.fields:nth-child(1) > .light-pink-box > div:nth-child(2)")
    title = item[0].string.split()[-2:]
    title.append("нових випадків за добу.")

    #число та місяць
    item = html.select("div.one-field:nth-child(7) > div:nth-child(1) > p:nth-child(1) > span:nth-child(1)")
    number, month = item[0].string.split()[-2:]

    #вивід
    print(*title, end = " ")
    print(f"\nІнформація станом на {number} {month}.")

14

Re: бібліотека BeautifulSoup4 парсер covid19.gov.ua

mamkin haker написав:

а ви те довго робили?
я б до такого б точно сам недодумався :D

Пхати список у стрічку, а потім видаляти [] - неправильно. Нам же лише одне поле зі списку ніби потрібне? Значить, беремо item[0]. Це не стрічка, а якесь BS-не представлення тега. Перебираємо властивості, бачимо string, перевіряємо - о, це внутрішній вміст, без тегів. Замість

a = щось[передостаннє]
b = щось[останнє]

писати

a, b = щось[-2:]

загалом, ідея для Python тривіальна, просто звикнути треба.
Хоча остання операція не дуже правильна. Якщо повідомлення мінімально змінять - скажімо, додадуть рік - скрипт писатиме дурню. Тому правильніше буде не видобувати дату без потреби, а прямо так і виводити:

date_text = item[0].string
...
print(f"\n{date_text}.")
Подякували: mamkin haker1