Публикации: 36
Теми: 2
Член от: Apr 2020
Репутация:
2
11-03-2021, 13:23
(Последна редакция: Преди 11-03-2021, 13:38 от zypy.)
Благодаря, би ли пояснил
Код: ('"hour">(.+?)<.+?"name">(.+?)<.+?"type">(.+?)<')
и по точно защо е това и как работи , точно тази част от кода < .+?"
Това е окончателният код , хваща програмата на БНТ 1,2,3,4 само с промяна на цифрата в url
Код: #!/usr/bin/python env
import bs4
import re
import sys
from datetime import date
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
my_url='https://bnt.bg/program/bnt1'
today = date.today()
d = today.strftime("%Y%m%d")
s = 'in-tabs-descr tab tab-holder-'
uClient = uReq(my_url)
page_soup = soup(uClient.read(), "html.parser")
uClient.close()
containers = page_soup.find("div" ,{"class":s+d})
con = containers.findAll('span')
data = str(con).replace('><' , '> <')
match = re.compile('"hour">(.+?)<.+?"name">(.+?)<.+?"type">(.+?)<').findall(data)
#print (match)
for hour, name, type in match:
desc = hour.strip() + ' ' + name.strip() + ' - ' + type.strip()
print (desc)
Публикации: 1,629
Теми: 18
Член от: Nov 2015
Репутация:
226
(11-03-2021, 13:23)zypy написа: Благодаря, би ли пояснил
Код: ('"hour">(.+?)<.+?"name">(.+?)<.+?"type">(.+?)<')
и по точно защо е това и как работи , точно тази част от кода < .+?"
Всъщност е само .+?, другото е от текста, който парсваме, а .+? означава да вземе всичко между две избрани неща. Т.е. заявката звучи така:
намери всичко, което е между "hour">(тук вземи стойност 1) и <, след това просто прескачаме с .+? останалия текст, докато стигнем до следващото присвояване на стойност, която е между "name">(тук вземи стойност 2) и <, после пак прескачаме с .+? докато стигнем до третата стойност, която е между "type">(тук вземи стойност 3) и <. И това е всичко. За да вземеш стойност, трябва да я ограничиш между нещо, за това имаме начало, стойност, край. В нашия случай, просто < е първия символ в текста, след стйоността, която искаме да вземем и за това слагам него. Когато .+? е в скоби, означава, че присвояваме стойността на съответното място, а когато не е в скоби, просто прескачаме целия текст до следващото нещо, което ни интересува.
Публикации: 36
Теми: 2
Член от: Apr 2020
Репутация:
2
28-05-2022, 21:05
(Последна редакция: Преди 29-05-2022, 11:30 от zypy.)
Написах един скрипт който извлича програма за даден канал на телевизия от "dnes точка bg "
Код: #!/usr/bin/python3
import bs4
import re
import sys
from datetime import date
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
nom = sys.argv[1]
my_url=f'https://www.dnes.bg/tv.php?tv={nom}'
uClient = uReq(my_url)
page_soup = soup(uClient.read(), "html.parser")
uClient.close()
containers = page_soup.find("div" ,{"class":"pad bProgram"})
con = containers.findAll("div" ,{"class":"b5 tv_line clearfix"})
data = str(con).replace('</div>' , ' ').replace(',' , ' ').replace('<span class="now">' , ' ').replace('<div class="now">' , ' ')
match = re.compile('"info">(.+?)<.+?"ttl">(.+?)<.+?', re.S).findall(data)
for info, ttl in match:
desc = info.strip() + ' - ' + ttl.strip()
print (desc)
Когато се извиква скрипта се очаква да се добави като аргумент число .При мен работи с допълнителен bash скрипт.
Код: #!/bin/bash
echo "
btv = 13
btvc = 4725
nova = 42
knova = 20
hbo = 14
hbo2 = 11212
hbo3 = 11213
discovery = 56
bnt1 =11199
bnt2 = 11087
bnt3 = 11234
bnt4 = 11235
dav = 11120
tv1000 = 8429
ort = 11133
movst = 11178
ntv = 11244
nickt = 11256"
let ch=0
#as long as phonex is 0 keep looping
while [ $ch -eq 0 ];
do
#get channel
echo "Избери канал"
read ch
#make sure the input contains digits
if [[ $ch =~ [0-9] ]];
then
#if it does contain digits
#change ch value to stop loop
python3 ~/bin/tvpr $ch # това е пътя и името на горният скрипт
let ch=1
else
clear
echo "invalid number"
sleep 1
fi
done
Може да се направи и с един файл само на питон, но понеже познанията ми за питон клонят към нула го направих както мога
Публикации: 36
Теми: 2
Член от: Apr 2020
Репутация:
2
11-06-2022, 12:44
(Последна редакция: Преди 11-06-2022, 12:47 от zypy.)
Вместо горният скрипт може използвате този направо от десктопа ,ако ползвате KDE, преди това инсталирайте от пакетния си менижър kdialog.
Код: #!/bin/bash
choice=$(kdialog --combobox "Избери телевизия:" "BTV" "BTVCinema" "BTVComedy" "BTVAction" "FOX""FoxLife" "Nova" "KinoNova" "HBO" "HBO2" "HBO3" "TV1000" "Discovery" "Explorer" "Nature" "History" "HistoryCH" "NGW" "NG" "ORT" "MoviStar" "BNT1" "BNT2" "BNT3" "BNT4" "DaVinci" "NikToons" "Nikilodeon" "BulgariaONAIR");
case "$choice" in
BTV)
tv=$(python3 ~/bin/tvpr 13)
kdialog --msgbox "$tv";
;;
BTVCinema)
tv=$(python3 ~/bin/tvpr 4725)
kdialog --msgbox "$tv";
;;
BTVComedy)
tv=$(python3 ~/bin/tvpr 4404)
kdialog --msgbox "$tv";
;;
BTVAction)
tv=$(python3 ~/bin/tvpr 4403)
kdialog --msgbox "$tv";
;;
Nova)
tv=$(python3 ~/bin/tvpr 42)
kdialog --msgbox "$tv";
;;
KinoNova)
tv=$(python3 ~/bin/tvpr 20)
kdialog --msgbox "$tv";
;;
FOX)
tv=$(python3 ~/bin/tvpr 11092)
kdialog --msgbox "$tv";
;;
FoxLife)
tv=$(python3 ~/bin/tvpr 36)
kdialog --msgbox "$tv";
;;
HBO)
tv=$(python3 ~/bin/tvpr 14)
kdialog --msgbox "$tv";
;;
HBO2)
tv=$(python3 ~/bin/tvpr 11212)
kdialog --msgbox "$tv";
;;
HBO3)
tv=$(python3 ~/bin/tvpr 11213)
kdialog --msgbox "$tv";
;;
TV1000)
tv=$(python3 ~/bin/tvpr 8429)
kdialog --msgbox "$tv";
;;
MoviStar)
tv=$(python3 ~/bin/tvpr 11178)
kdialog --msgbox "$tv";
;;
BNT1)
tv=$(python3 ~/bin/tvpr 11199)
kdialog --msgbox "$tv";
;;
BNT2)
tv=$(python3 ~/bin/tvpr 11087)
kdialog --msgbox "$tv";
;;
BNT3)
tv=$(python3 ~/bin/tvpr 11234)
kdialog --msgbox "$tv";
;;
BNT4)
tv=$(python3 ~/bin/tvpr 11235)
kdialog --msgbox "$tv";
;;
BulgariaONAIR)
tv=$(python3 ~/bin/tvpr 38)
kdialog --msgbox "$tv";
;;
ORT)
tv=$(python3 ~/bin/tvpr 11133)
kdialog --msgbox "$tv";
;;
Discovery)
tv=$(python3 ~/bin/tvpr 56)
kdialog --msgbox "$tv";
;;
Explorer)
tv=$(python3 ~/bin/tvpr 9899)
kdialog --msgbox "$tv";
;;
Nature)
tv=$(python3 ~/bin/tvpr 11125)
kdialog --msgbox "$tv";
;;
History)
tv=$(python3 ~/bin/tvpr 8117)
kdialog --msgbox "$tv";
;;
HistoryCH)
tv=$(python3 ~/bin/tvpr 11158)
kdialog --msgbox "$tv";
;;
NGW)
tv=$(python3 ~/bin/tvpr 11112)
kdialog --msgbox "$tv";
;;
NG)
tv=$(python3 ~/bin/tvpr 65)
kdialog --msgbox "$tv";
;;
DaVinci)
tv=$(python3 ~/bin/tvpr 11120)
kdialog --msgbox "$tv";
;;
Nikilodeon)
tv=$(python3 ~/bin/tvpr 11159)
kdialog --msgbox "$tv";
;;
NikToons)
tv=$(python3 ~/bin/tvpr 11256)
kdialog --msgbox "$tv";
;;
*)
kdialog --sorry "Не си избрал TV";
;;
esac;
|