Szöveg szétválogatás

Fórumok

Helló!

Különböző publikus Facebook oldalak tartalmát kell elemezzem, Ehhez szeretnék kérni egy kis segítséget.

Így néz ki egy post lynx-vel kidumpolva:

Egymillióan a magyar sajtószabadságért

A szervezet egyben harcot hirdet az értékpluralizmus ellen, szerintük a fenti
értékekkel egyet nem értők a rossz, a károkozás, az erkölcstelenség, az
embertelenség és a hazugság képviselői, ezért a médiából cenzúrázni kellene
őket – hangsúlyozza a Magyar LMBT Szövetség közleménye.

See translation
A kirekesztés nem tudomány
gepnarancs.hu
A Magyar LMBT Szövetség tiltakozásának ad hangot, amiért Magyar
Családtudományi Társaság néven homofób, kirekesztő nézeteket
tudományos programként népszerűsíteni kívánó szervezet jött létre.
Különösen aggasztónak tartja, hogy a szervezet létrehozása fölött
állami szervek és vezetőik bábáskodtak.
(Submit) LikeUnlike · [BUTTON Input] (not implemented)_______ ·
Share · 27 February at 10:30 ·
+
+ 191 people like this.
+
+
o View all 85 comments
60 shares60 shares
+
Write a comment...__________________________________________
____________________________________________________________
____________________________________________________________
____________________________________________________________
Press Enter to post your comment.
Comment

Ebből szeretném kinyerni a "Egymillióan a magyar sajtószabadságért" és a "See translation" közötti részre (ez maga a post szövege).
A dátumra, ami az első Share és az új sor között van.
A likeok számára ami a "people like this." szöveg előtti szám.
A commentek számára ami a "View all XX comments" -ben lévő szám.
Valamint a megosztások számára ami a "shares" rész után van.

(Aztán nyilván, újra a következő poston.)

Ezt szeretném úgy rendezni hogy:
Post&Dátum&likok_száma&kommentek_száma&megosztások_száma&
Post&Dátum&likok_száma&kommentek_száma&megosztások_száma&

Hogyha tudna segíteni valaki azt nagyon megköszönném. :)

Hozzászólások

es?
hol tartasz most?
hol akadtal el?

t

"awk-val próbáltam kikanalazni a megfelelő részeket, de már a postok kinyerése is kidarcba fulladt."
Pedig a post kinyerését azért egy rendkívül egyszerű feladatnak mondhatnánk:
 

  awk 'NR > 1 { if ($0 == "See translation") exit; else print }'

 
 
A többi sem olyan bonyolult. Több egymást követő, a topiknyitóban megadott mintájú postokra, nem túl szépen, csak nagy vonalakban, de könnyen érthetően:


{
  ++PRC;
  if (PRC <=1) next

  if (SEE == 0)
    if ($0 != "See translation")
      printf "%s", $0
    else
      SEE = 1
  else {
    switch ($0) {
      case /\+ [0-9]+ people like this.$/:
        L = $2; next
      case /^Share · .* ·.*/:
        D = $0; gsub(/(^Share[^0-9]+|[^0-9]*$)/, "", D); next
      case /^o View all [0-9]+ comments$/:
        C = $4; next
      case /^[0-9]+ shares[0-9]+ shares$/:
        S = $1; next
      case /^Comment$/:
        PRC = 0; SEE = 0; print "&" D "&" L "&" C "&" S "&"; next
    }
  }
}

A fenti kód nem teljes, de el tudsz indulni belőle, és tovább tudod faragni, ha ragaszkodsz ehhez a nem éppen egyszerű Firefox->lynx->awk vonalhoz. Nyosigomboc írta alább, vannak ehhez céleszközök, nem biztos, hogy ez a módszer a célszerű.

Ezt miert lynx dumpbol csinalod?
Mi a konkret URL? (hogy ugyanazon teszteljek)
Mihez kell segitseg?

--
R2D2 a filmtörténet legmocskosabb szájú karaktere.
Minden szavát kisípolták.

A FB-on nincs linkje a postoknak. A postok sorban szerepelnek egy JS-el gazdagon díszített oldalon. Azonosítója persze van az egyes postoknak (sőt, mindennek), de én nem ismerek módszert, amivel az egyes ID-hez tartozó postokat ki lehetne kanalazni. Már ha nincs erre - vagy nem ír erre valaki - app(ot), de azt az appot a figyelni kívánt oldal gazdájának engedélyezni kell, hogy hozzáférjen a postokhoz (is).

Én úgy csináltam, hogy a Facebook falat "meghosszabbítottam" odáig amikortól kb kezdeném az elemzést, Firefox-val lementettem az oldalt, majd azt lynx --dump-pal hoztam ilyen formátumra.

Először a forráskódban akartam túrni de annyira kusza össze-visszaság van benne, hogy inkább ennél maradnék.

Elvileg a Facebook API-ja többé-kevésbé lehetőséget adna arra, hogy kinyerhető legyen egyesével a sok post de ez szerintem már bőségesen meghaladja a tudásomat.

Próbáltad már a simplehtmldom-ot? Az FB forrásával az a baj, hogy több benne a JS mint a html, így picit macerás a dumpolása, de ha megvan egy html lap, akkor abban elég jól lehet vele bogarászni.

Amit én csinálnék: firefox, tools, web developer, inspect, ezzel ki tudod bogarászni, hogy melyik div-ben mit kell keresni, erre komplett példa van a manualban:

// Find all <li> in <ul>
foreach($html->find('ul') as $ul)
{
       foreach($ul->find('li') as $li)
       {
             // do something...
       }
}

NINCS olyan URL. Ha megnézed a FB egy oldalának a forrását, akkor látni fogod, hogy 50% JS, ami kikalapálja a végleges oldalt, alig van benne hagyományos HTML rész. Gondolom így spórolnak a szerveroldali erőforrásokkal (vagy nem tudom, túl sok woodoo van benne :D).

Bár tényleg nem lett volna hátrány, ha a derék kérdező leírja, hogy miképp jutott el oda, ahol megtorpant.

Na, és mégis van, ehehe. Kellett nekem okoskodni. És nem is olyan rém bonyolult kiszedni:
- kell a weblap dump
- abból ki kell szürcsölni a 'story_fbid%3D167903726660276"' stringet
- ebből az érdekes rész a 'story_fbid%3D' utáni ID
- amit a megfelelő URL végére biggyesztve kijön a vágyott URL:

http://www.facebook.com/sajtoszabadsagert/posts/167903726660276

Itt a '< span class="translationEligibleUserMessage" >' tartalma ami kell (legalábbis nálam)

Sajnos ezt az url-t se lehet lekarmolni wget-el, de talán rá lehet venni egy JS képes browsert, hogy nyomtasson, vagy mentse el a weblapot. De addig ez még nem nagy haladás, ugyanaz mint a főoldal, csak annyi a különbség, hogy minden post már eleve ki van bontva :(

Mostanaban elegge felkapott terulet lett, web scrapingnek hivjak, sok lib/framework keszult erre.
Amikor eloszor kellett ilyet csinalnom, meg nem voltak ennyire elterjedve, utana ugy kb. a 3. ilyen feladatomnal meguntam, es en is irtam egy ilyet (bar a kodjat tekintve eleg ronda lett).

--
R2D2 a filmtörténet legmocskosabb szájú karaktere.
Minden szavát kisípolták.

A Calibre nevezetű programmal is meg lehet csinálni. Lehet kimeneti formátumnak txt-t választani, és parancssorból is futtatható, akár cronnal is. Egy recipe fájlt kell írnod, arra hogy mit akarsz kivágni, illetve hogy milyen legyen a kimeneti fájl felépítése. Sok ötletet lehet meríteni a már kész recipe fájlokból.

Bár, ha sem a recipe fájlokhoz, sem az awk-hoz nem értesz, akkor mindegy, hogy melyikben mélyedsz el.

-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.

Remelem, halad, de amugy - a perl-t nem pont erre talaltak ki?

En ertem hogy azota kavetfozni is tud, de mint ahogy weboldalt is lelkiismeret-furdalas nelkul fejlesztek php-ben, erre a perl tokeletesen alkalmas lehet.

Sziasztok

Adott 1 sor amiben vagy van e-mail cím vagy nincs. Az a cél, hogyha van, akkor az e-mail címet ki tudjam emelni, hogy változóba tegyem.
Az e-mail cím előtt és után legalább 1 szóköz van.
Nem tudom, meg lehet-e valósítani valami trükkel?