Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: wyciągnęcie danych z www  (Przeczytany 6419 razy)

lwiaros

  • Gość
wyciągnęcie danych z www
« dnia: 2015-03-27, 23:21:31 »
jak w GAWK wyciągnąć z tekstu (html) zakres znaków bez (granic zakresu)
np
gawk "/początek/,/koniec/  {print}"storna.html #aby wydrukowało bez początku  i końca?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
wyciągnęcie danych z www
« Odpowiedź #1 dnia: 2015-03-28, 15:26:08 »
Łomatko. Piłem kawę, ale dalej nie rozumiem pytania.

Daj przykład tekstu wejściowego i co chcesz na wyjściu.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

lwiaros

  • Gość
wyciągnęcie danych z www
« Odpowiedź #2 dnia: 2015-03-29, 21:46:11 »
np
<td class='godzina>coś tam
coś tam</td>

i che tylko tekst "coś tam  coś tam" (a tekst ma kilka wierszy)
« Ostatnia zmiana: 2015-08-10, 11:11:00 wysłana przez Arkadiusz Bednarczyk »

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
wyciągnęcie danych z www
« Odpowiedź #3 dnia: 2015-03-29, 23:42:32 »
Dlaczego zakładasz, że awk będzie najlepsze do tego zadania?

Możesz użyć Basha:

#!/bin/bash
text=$(cat)
regexp='<td[^>]*>([^<]*)</td>(.*)'
while true do
  if [[ "$text" =~ $regexp ]]; then
    echo "${BASH_REMATCH[1]}"
    text="${BASH_REMATCH[2]}"
  else
    break
  fi
done
$ echo '<td class="godzina">10:00</td><td class="godzina">11:00</td>' | ./skrypt.sh
Niestety Bash obsługuje jedynie zachłanne wyrażenia regularne, stąd trochę naciągana składnia regexpa w powyższym kodzie.
Na na szybko nie stworzysz dobrego parsera do HTMLa.
Więc czemu nie użyć gotowego? Na przykład cheerio dla node.js:

var cheerio = require('cheerio');
$ = cheerio.load('<td class="godzina">10:00</td><td class="godzina">11:00</td>');
$('td.godzina').each(
  function() {
    console.log($(this).text());
  }
);
Nie zapomnij zainstalować cheerio:

npm install cheerio
« Ostatnia zmiana: 2015-08-10, 11:12:33 wysłana przez Arkadiusz Bednarczyk »

lwiaros

  • Gość
wyciągnęcie danych z www
« Odpowiedź #4 dnia: 2015-03-31, 14:18:02 »
Cytat: ultr
Dlaczego zakładasz, że awk będzie najlepsze do tego zadania?
Bo chciałbym aby skrypt powłoki to wykonywał, a wynik był wyświetlany w terminalu, ale jednak się przeliczyłem sporo to kombinacji wymaga.

Co do Node.js i parsera www  cheerio , będzie ciężko nigdy nie programowałem (C, C++, JavaScript).

Teraz to nie wiem co mam zrobić, pewnie będę to męczył w bash awk sed,

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
wyciągnęcie danych z www
« Odpowiedź #5 dnia: 2015-04-01, 08:39:40 »
To co potrzebujesz nazywa się "web scraping" ("skrobanie" stron WWW). Są temu poświęcone grube artykuły i biblioteki tworzone przez mądrych ludzi. Dla Node.JS jest wspomniane cheerio, dla Pythona ScraPy i Beautiful Soup. Praktycznie każdy język ma jakąś bibliotekę do wyciągania danych ze stron WWW.

Skoro nigdy nie programowałeś, to ciężko będzie rozwiązać ci ten problem, tym bardziej za pomocą narzędzi nie przeznaczonych do tego (sed, awk). Z jednym wyjątkiem - może się to udać w ten sposób, gdy "drapana" strona ma stałą, znaną strukturę, w szczególności generowaną maszynowo (jakieś zestawienia, raporty, itp). Wtedy możę dasz radę kombinacją awk/sed/grep/cut/bash, według wskazań kolegi ultr.
« Ostatnia zmiana: 2015-08-10, 11:15:10 wysłana przez Arkadiusz Bednarczyk »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

lwiaros

  • Gość
wyciągnęcie danych z www
« Odpowiedź #6 dnia: 2015-04-12, 23:44:13 »
Jakoś się tak złożyło że ominołem programowanie w C++ dużym łukiem i tym podobne języki np java oprócz php. Strona ma pewne regularności, jakoś doszedłem do końca ale, skrypt nie jest wysokich lotów macie racje awk nie został do tego stworzony.

pawelpik

  • Gość
Odp: wyciągnęcie danych z www
« Odpowiedź #7 dnia: 2015-08-10, 11:03:57 »
Sam korzystałem do tego celu z modułu BeatifulSoup w Pythonie. Pomimo tego, że nie miałem dużego doświadczenia, zadanie nie było specjalnie trudne. W sieci jest wiele tutoriali, które uczą podstaw języków programowania. Python akurat jest na początek łatwy do ogarnięcia.

lukas - ospulse.pl

  • Gość
Odp: wyciągnęcie danych z www
« Odpowiedź #8 dnia: 2016-03-24, 14:24:32 »
Bash umożliwia przetwarzanie danych na niskim poziomie, więc nic nie stoi na przeszkodzie, żeby każdy pojedynczy znak zastąpić innym. Można oczywiście wykorzystać do tego inne narzędzie, program np. sed'a.
#!/bin/bash
 
while read line
do
 
   for ((i=0 ; i < ${#line} ; i++))
   do
     
   case ${line:i:1} in
      '<') echo -n '[początek znacznika td]' ;;
      '>') echo -n '[koniec znacznika td]'   ;;
        *) echo -n "${line:i:1}"  #Tekst Pożądany
   esac

   done ; echo ''

done < plik.html

Wynik w Terminalu
Cytuj
lukas@pc:~/Pulpit$ ./skrypt_1.sh
[początek znacznika td]td class='godzina[koniec znacznika td]coś tam
coś tam[początek znacznika td]/td[koniec znacznika td]

Po zamianie znaku zaczynającego znacznik < na znak spacji i znaku kończącego znacznik > na znak spacji, mamy gotowe stringi dla pętli for string in $line ; do ; done
#!/bin/bash

while read line
do

   for string in $line
   do

   case $string in
   'td')  continue ;;
   '/td') continue ;;
   "class='godzina'") continue ;;
   *) echo -n $string
   esac

   done ; echo ''

done < plik.html

Opcjonalnie, zamiast continue, można skorzystać z:
'td') echo $string 1> /dev/null  #leci do kosza ;;
'/td') echo ''  #nic nie drukuje ;;
Wynik w Terminalu
Cytuj
lukas@pc:~/Pulpit$ ./skrypt_2.sh
coś tam
coś tam

Da się to wszystko połączyć w całość, stworzyć jeden skrypt wykorzystując zmienne tablicowe.
#!/bin/bash

while read line
do

   tab[i]=$line
   i=$((++i))

done < plik.html

for(( i=0 ; i < ${#tab[*]} ; i++ ))
do
   echo wiersz [$i]: ${tab[i]}
done

Wynik w Terminalu
Cytuj
lukas@pc:~/Pulpit$ ./skrypt_3.sh
wiersz[0]: td class='godzina' coś tam   #widoczne stringi, łańcuchy znaków oddzielone znakami spacji po to, żeby konstrukcja pętli for załatwiła za nas całość.
wiersz[1]: coś tam /td

Objaśnienie Tutaj
« Ostatnia zmiana: 2016-03-24, 15:32:41 wysłana przez lukas - ospulse.pl »