Vilket programmeringsspråk för följande syfte?

Permalänk
Medlem

Vilket programmeringsspråk för följande syfte?

Jag vill göra en funktion dom indexerar enviss del av en sida, som t.ex. Betyget för en film på imdb, ni förstår?

Det vore smidigt om det går att göra i php, dels för att det är mycket lätt att infoga datan i en databas, men framför allt för att man ha filen på ett webhotell och sedan köra det så ofta man behagar via ett cronjobb. Skulle det fungera på något sätt, och i så fall: hur?

Eller måste man använda något annat språk, och i så fall, vilket?

Permalänk
Medlem

Går utmärkt i PHP. Ämnen att undersöka är cURL och DOMDocument.

Permalänk
Medlem

Jag har kollat lite och upptäckt att det jag vill göra fungerar lite som en crawlbot. Jag h.ar hittatm ett script, där jag har ställt in så att jag enbart indexerar .php sidor, alltså inga bilder eller nått annat. Jagkan tyvärr inte testa sceiptet då jag är utomlands och skriver från en ipad. Det jag vill ha som kag inte riktigt vet ärmatt jag enbart ska indexera en vis del av alla källkod i .php-filen, text allt inom <p>. känns som en ganska komplex funktion. Hur ska jag gå tillväga?

Permalänk
Medlem
Skrivet av csmannen:

Jag har kollat lite och upptäckt att det jag vill göra fungerar lite som en crawlbot. Jag h.ar hittatm ett script, där jag har ställt in så att jag enbart indexerar .php sidor, alltså inga bilder eller nått annat. Jagkan tyvärr inte testa sceiptet då jag är utomlands och skriver från en ipad. Det jag vill ha som kag inte riktigt vet ärmatt jag enbart ska indexera en vis del av alla källkod i .php-filen, text allt inom <p>. känns som en ganska komplex funktion. Hur ska jag gå tillväga?

Läs in HMTL-koden till ett DOM-träd med en HTML-parser och leta i DOM-trädet efter rätt nod. Om elementet du vill ha har en klass blir detta enkelt. Kolla på DOMDocument.

Permalänk
Medlem
Skrivet av csmannen:

Jag har kollat lite och upptäckt att det jag vill göra fungerar lite som en crawlbot. Jag h.ar hittatm ett script, där jag har ställt in så att jag enbart indexerar .php sidor, alltså inga bilder eller nått annat. Jagkan tyvärr inte testa sceiptet då jag är utomlands och skriver från en ipad. Det jag vill ha som kag inte riktigt vet ärmatt jag enbart ska indexera en vis del av alla källkod i .php-filen, text allt inom <p>. känns som en ganska komplex funktion. Hur ska jag gå tillväga?

du kan ju använda dig av "regular expression" det finns i php.

Permalänk
Medlem
Skrivet av mattoys:

du kan ju använda dig av "regular expression" det finns i php.

Öh, nej. Man kan inte läsa HTML med reguljära uttryck, eftersom HTML inte är ett reguljärt språk. Det är oftast en dålig idé att försöka.

Permalänk
Medlem

Du länkar ju bara till personliga åsikter som inte har någon relevans för tråden eller mattoys post. Dessutom verkar de mer intresserade av att driva om Cthulu istället för att faktiskt bidra något.

Ditt påstående om att man inte kan läsa html med ett reguljärt uttryck för att html inte är ett reguljärt språk är ju bara helt jätteorelevant för sammanhanget och verkar vara taget ur luften. Vad menar du egentligen?

Jag håller med mattoys, reguljära uttryck kan man använda för att lösa problemet.

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<

Permalänk
Medlem
Skrivet av pscs3:

Ditt påstående om att man inte kan läsa html med ett reguljärt uttryck för att html inte är ett reguljärt språk är ju bara helt jätteorelevant för sammanhanget och verkar vara taget ur luften. Vad menar du egentligen?

Personliga åsikter? Nej, att HTML inte är ett reguljärt språk och därför inte kan läsas med hjälp av reguljära uttryck är fakta, inte åsikt. Att jag sedan påstår att man inte bör försöka göra det, det är en åsikt.

Skrivet av pscs3:

Jag håller med mattoys, reguljära uttryck kan man använda för att lösa problemet.

Det kan ”lösa” problemet, förutsatt att indatan är väldigt snäll. Men du kan ju skriva ett reguljärt uttryck för att plocka ut informationen, så kan jag skriva fullständigt korrekt HTML som dödar den. Det är mer robust, mer korrekt och oftast även enklare att utgå från rätt verktyg (en HTML-parser) för att lösa problemet.

Permalänk
Medlem
Skrivet av You:

Personliga åsikter? Nej, att HTML inte är ett reguljärt språk och därför inte kan läsas med hjälp av reguljära uttryck är fakta, inte åsikt. Att jag sedan påstår att man inte bör försöka göra det, det är en åsikt.

Från andra länken:

Citat:

In computing, a regular expression, also referred to as regex or regexp, provides a concise and flexible means for matching strings of text, such as particular characters, words, or patterns of characters.

Det är ju precis det TS vill göra. Det har Inget med möjligheten att läsa icke-reguljära språk med reguljära uttryck att göra. Vad får du din "fakta" ifrån egentligen?

Skrivet av You:

Det kan ”lösa” problemet, förutsatt att indatan är väldigt snäll. Men du kan ju skriva ett reguljärt uttryck för att plocka ut informationen, så kan jag skriva fullständigt korrekt HTML som dödar den. Det är mer robust, mer korrekt och oftast även enklare att utgå från rätt verktyg (en HTML-parser) för att lösa problemet.

På vilket sätt måste inte indatan vara lika snäll om du använder en parser? Du måste ändå känna till delar av sidan du försöker läsa, antagligen alltid så mycket att du kan avgöra om det går att göra med ett reguljärt uttryck eller inte.

Edit: glömde 2 ord i en mening...

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<

Permalänk
Medlem

Har kollat lite och domdocs vekar vara det jag letar efter. Jag tror att det går att göra med r eguljära uttryck också, men nu väljer jag att lära mig något nytt.

Här är ett lätt exempel jag hittade (har inte testat det än)

// Create DOM from URL or file $html = file_get_html('http://www.google.com/'); // Find all images foreach($html->find('img') as $element)        echo $element->src . '<br>'; // Find all links foreach($html->find('a') as $element)        echo $element->href . '<br>';

http://simplehtmldom.sourceforge.net/ Det är alltså funktioner, från scriptet som man kan ladda ner från sourceforge?

Det verkar lite som att man måste abvända reguljära uttryck om inget api finns, eller går det att lösa på annat sätt via dom? You?

Man kan alltså då hämta ut all <p>-element. Hur gör man sen för att hämta alla p-element som inne håller ordet X? Hemskt att jag inte har tillgång till en dator så jag kan testa...

Permalänk
Medlem
Skrivet av pscs3:

Det är ju precis det TS vill göra. Det har Inget med möjligheten att läsa icke-reguljära språk med reguljära uttryck att göra. Vad får du din "fakta" ifrån egentligen?

Som du kanske läste på Wikipedia-sidan (eller inte) beskrive reguljära uttryck reguljära språk, och har därför exakt samma deskriptiva kraft som reguljär grammatik. SGML (och därmed HTML) är enligt Wikipedia en grammatik av högre Chomsky-hierarki, och kan därför inte tolkas av reguljära uttryck. Bitar av HTML kan tolkas med reguljära uttryck, men i det allmänna fallet är det inte möjligt.

En annan viktig poäng är att man inte bör återuppfinna hjulet. Det man gör är att tolka HTML, och det finns bra, vältestade verktyg för detta. Varför ska du då skriva någon hafsig regexp du inte kan testa tillräckligt bra, istället för att använda dessa verktyg?

Skrivet av pscs3:

På vilket sätt måste inte indatan vara lika snäll om du använder en parser? Du måste ändå känna till delar av sidan du försöker läsa, antagligen alltid så mycket att du kan avgöra om det går att göra med ett reguljärt uttryck eller inte.

Låt oss säga att vi vill som TS säger ta reda på betyget av en film hos IMDB. Vi skulle kunna göra detta med ett reguljärt uttryck (kanske, du kan ju skriva ett om du känner att det är meningsfullt), och detta skulle fungera tills IMDB gör någon ändring som förstör det. Denna ändring kan vara var som helst på sidan, det räcker med en HTML-kommentar som innehåller något din regexp plockar upp. Om man å andra sidan använder en HTML-parser, så kan man använda DOM-trädet för att leta fram rätt nod. Med CSS-notation kan vi således, istället för någon hemsk regexp, leta upp elementet .rating-rating .value, som vi kan anta kommer att hållas konstant även om IMDB byter layout (och om det inte gör det, är en ny CSS-selektor lättare att hitta än en ny regexp). Nu har IMDB även satt itemProp="ratingValue" på elementet i fråga, så det blir ännu enklare (och troligtvis säkrare), men du förstår säkert min poäng. Den här lösningen ta kanske en två-tre minuter för mig att slänga ihop med Ruby och Hpricot. Hur lång tid tar det för dig att slänga ihop motsvarande regexp? Kommer den att fungera i alla edge cases?

(Vill man göra helt rätt ska man så klart först kolla om sidan i fråga har ett API, vilket i så fall gör att man helt slipper crawla och fulhacka.)

Edit: For reference:

require 'rubygems' require 'hpricot' require 'open-uri' doc = Hpricot(open('http://www.imdb.com/title/tt0118715/').read) betyg = oc.search('.rating-rating .value')[0].innerText.to_f

Permalänk
Medlem

Nu ser jag att cURL även klarar av uppgiften, frågan är dock vad som klarar av min uppgift lättast, curl ellr domdocs? Det verksr som domsdocs är lite lättare, men jag har egentligen ingen anning...

Hur gör man om en sida inte har ett API, utan bara paragrafer med text i?

Permalänk
Medlem
Skrivet av You:

Som du kanske läste på Wikipedia-sidan (eller inte) beskrive reguljära uttryck reguljära språk, och har därför exakt samma deskriptiva kraft som reguljär grammatik. SGML (och därmed HTML) är enligt Wikipedia en grammatik av högre Chomsky-hierarki, och kan därför inte tolkas av reguljära uttryck. Bitar av HTML kan tolkas med reguljära uttryck, men i det allmänna fallet är det inte möjligt.

Du får jättegärna citera den biten som definierar reguljära uttryck till att enbart användas till reguljära språk. För på wikipedia hittar jag det verkligen inte, jag har letat och letat både en, två, tre och fem gånger och läst i de närmaste referenserna använda där. Jag håller fast vi att din "fakta" fortfarande består av personliga åsikter då inget du länkat hittills stödjer uttalandet.

Innehållet på en html-sida kan tolkas som en sträng och därför kan reguljära uttryck fungera för att lösa TS problem.

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<

Permalänk
Medlem
Skrivet av pscs3:

Du får jättegärna citera den biten som definierar reguljära uttryck till att enbart användas till reguljära språk. För på wikipedia hittar jag det verkligen inte, jag har letat och letat både en, två, tre och fem gånger och läst i de närmaste referenserna använda där. Jag håller fast vi att din "fakta" fortfarande består av personliga åsikter då inget du länkat hittills stödjer uttalandet.

Innehållet på en html-sida kan tolkas som en sträng och därför kan reguljära uttryck fungera för att lösa TS problem.

Följande citat bör förklara:

Citat:

Regular expression: Formal language theory
Regular expressions describe regular languages in formal language theory. They have thus the same expressive power as regular grammars.

Citat:

SGML: Formal characterization
There appears to be no definitive classification of full SGML against a known class of formal grammar. Plausible classes may include tree-adjoining grammars and adaptive grammars.

Notera här att "tree-adjoining grammar" ligger i typ-1-grammatiken i Chomsky-hierarkin.

Citat:

Formal grammar: The Chomsky Hierarchy
When Noam Chomsky first formalized generative grammars in 1956, he classified them into types now known as the Chomsky hierarchy. The difference between these types is that they have increasingly strict production rules and can express fewer formal languages.

Detta ska alltså tolkas som att ex. typ-3-grammatik är striktare än typ-2-grammatik, och att ett system som beskriver typ-3-grammatik därför inte kan beskriva typ-2-grammatik. Notera här att reguljära uttryck beskriver typ-3-grammatik, medans SGML som sagt är typ-1-grammatik. Ergo, reguljära uttryck kan inte beskriva SGML.

Att det är "en sträng" har inget med saken att göra. Jag kan serialisera all data på min hårddisk som "en sträng", men det innebär inte per automatik att du kan få ut meningsfull data ur denna "sträng" med hjälp av reguljära uttryck.

Permalänk
Medlem
Skrivet av You:

Detta ska alltså tolkas som att ex. typ-3-grammatik är striktare än typ-2-grammatik, och att ett system som beskriver typ-3-grammatik därför inte kan beskriva typ-2-grammatik. Notera här att reguljära uttryck beskriver typ-3-grammatik, medans SGML som sagt är typ-1-grammatik. Ergo, reguljära uttryck kan inte beskriva SGML.

Men varför är det intressant eller relevant? Du svävar iväg med information som inte har nästan någon sammankoppling med de uttalanden som du hävdade var fakta. Du får jättegärna citera den biten som definierar reguljära uttryck till att enbart användas till reguljära språk.

Visa signatur

Cat funeral! Cat funeral!
>>> 112383 <<<

Permalänk
Medlem
Skrivet av pscs3:

Men varför är det intressant eller relevant? Du svävar iväg med information som inte har nästan någon sammankoppling med de uttalanden som du hävdade var fakta. Du får jättegärna citera den biten som definierar reguljära uttryck till att enbart användas till reguljära språk.

Det är ju inte en mening som säger det, det är en kombination av definitioner och formell språkteori som mynnar ut i den konsekvensen.

Permalänk
Medlem

Programmering är en konst inte en vetenskap. Problemet You är att du påpekar att det är "fel" att använde regexp till htmlparsing när det i vissa fall kan vara fullt tillräckligt(har du som utvecklare aldrig fulhackat något?). Välj att uttrycka dig lite "fluffigare" så slipper du alla flamewars

I övrigt, csmannen:
När du endast vill ha p-taggar med ett visst innehåll så får du övergå till att köra lite ifsatser på dina matchande element. Du bör göra ifsatserna på plaintext för att slippa inre taggar och htmlkommentarer som kan förstöra allt. Ett annat sätt är att kolla efter index på p-taggen, men vid en omstrukturering av sidan så är risken ganska hög att denna skulle bli felaktig.
I imdbfallet så skulle jag nog gå på attributvärdet 'itemprop=ratingValue' då detta är ett attribut för att göra rating indexerbart. http://schema.org/Rating

Nu skulle man kunna gå och säga "man bör inte återuppfinna hjulet" och skicka iväg dig för att hitta en parser som hanterar schemat istället. Men jag tror det duger med en vanlig hederlig parser så som den du hittat.