2012-05-19 10 views
5

Quello che sto cercando di fare è essenzialmente la stessa cosa di un pulsante Tweet o di un pulsante Condividi/Mi piace di Facebook, e cioè di raschiare una pagina e il più titolo pertinente per un dato. Il miglior esempio a cui riesco a pensare è quando sei sulla prima pagina di un sito web con molti articoli e fai clic su un pulsante Mi piace di Facebook. Otterrà quindi le informazioni corrette per il post relative al (più vicino) pulsante Mi piace. Alcuni siti hanno tag Open Graph, ma alcuni non lo fanno e funzionano ancora.Pagina raschiare e ottenere il titolo o la descrizione più pertinente per le immagini con XPath

Dato che questo viene eseguito da remoto, ho solo il controllo dei dati che voglio targetizzare. In questo caso i dati sono immagini. Piuttosto che recuperare solo il <title> della pagina, sto cercando in qualche modo di attraversare la cupola al contrario dal punto di partenza di ogni immagine, e trovare il "titolo" più vicino. Il problema è che non tutti i titoli si verificano prima di un'immagine. Tuttavia, la possibilità che l'immagine si verifichi dopo il titolo in questo caso sembra piuttosto alta. Detto ciò, spero di farlo funzionare bene per quasi tutti i siti.

Pensieri:

  • trovare il "contenitore" delle immagini e quindi utilizzare il primo blocco di testo.
  • Trova i blocchi di testo in elementi che contengono determinate classi ("descrizione", "titolo") o elementi (h1, h2, h3, h4).

Titolo backup:

  • utilizzando Open Tag Grafico
  • utilizzando solo il <title>
  • Utilizzando tag ALT solo
  • Utilizzando meta tag

Sommario: Estrazione le immagini non è il problema, è come ottenere titoli rilevanti per loro.

Domanda: Come procederesti per ottenere titoli pertinenti per ciascuna immagine? Forse usando DomDocument o XPath?

+0

Onestamente, dopo aver raschiare con PHP, se è possibile distribuirlo tramite chiamate REST a un piccolo server Web Java, è possibile utilizzare JSOUP per ottenere facilmente l'accesso a tutti questi elementi e attributi. JSOUP è come jQuery per Java e utilizza la stessa sintassi. Vorrei che fosse disponibile per PHP in quanto avrebbe fatto sparire il tuo problema in pochi secondi! – jmort253

+0

ci sono diverse librerie disponibili che trattano l'estrazione di contenuti dalle pagine, anche se non ne conosco una che tratta direttamente con le immagini. ma potresti ottenere alcune idee e indicazioni o essere in grado di usarle. eccone uno: http://code.google.com/p/boilerpipe/wiki/Components –

+1

Grazie per i tuoi pensieri.Ho aggiornato la mia domanda per mirare più alla "logica" dietro l'ottenimento di titoli o descrizioni rilevanti per ciascuna immagine piuttosto che come ottenere le immagini stesse. – stwhite

risposta

1

Il tuo approccio sembra abbastanza buono, vorrei solo dare alcuni tag/attributi un peso e scorrere attraverso di loro con query XPath fino a trovare qualcosa che esce e non è nullo. Qualcosa di simile:

i = 0 

while (//img[i][@src]) 
    if (//img[i][@alt]) 
    return alt 
    else if (//img[i][@description]) 
    return description 
    else if (//img[i]/../p[0]) 
    return p 
    else 
    return (//title) 

    i++ 

Un semplice esempio XPath (funzione ported from my framework):

function ph_DOM($html, $xpath = null) 
{ 
    if (is_object($html) === true) 
    { 
     if (isset($xpath) === true) 
     { 
      $html = $html->xpath($xpath); 
     } 

     return $html; 
    } 

    else if (is_string($html) === true) 
    { 
     $dom = new DOMDocument(); 

     if (libxml_use_internal_errors(true) === true) 
     { 
      libxml_clear_errors(); 
     } 

     if ($dom->loadHTML(ph()->Text->Unicode->mb_html_entities($html)) === true) 
     { 
      return ph_DOM(simplexml_import_dom($dom), $xpath); 
     } 
    } 

    return false; 
} 

E l'effettivo utilizzo:

$html = file_get_contents('http://en.wikipedia.org/wiki/Photography'); 

print_r(ph_DOM($html, '//img')); // gets all images 
print_r(ph_DOM($html, '//img[@src]')); // gets all images that have a src 
print_r(ph_DOM($html, '//img[@src]/..')); // gets all images that have a src and their parent element 
print_r(ph_DOM($html, '//img[@src]/../..')); // and so on... 
print_r(ph_DOM($html, '//title')); // get the title of the page 
+0

Ho letto su XPath e in realtà ho iniziato a testare alcune opzioni, ma puoi approfondire questo argomento? Trovare la distanza tra i nodi sembra una buona idea, tuttavia non ho ancora trovato una soluzione. – stwhite

+0

@stwhite: In realtà non è stata una mia idea, devi solo iniziare con il livello più alto di specificità (tag 'img') e lavorare fino a trovare qualcosa che vorresti considerare come descrittivo. –

+0

Mi rendo conto che questa non era la tua idea iniziale, ma hai qualche idea su come ottenere la distanza tra i nodi trovati? Ad esempio, trovare la posizione dell'immagine corrente su un precedente H1 rispetto alla distanza dall'immagine a un h2 precedente. Ciò sembrerebbe dare un punteggio di cui è più probabile che sia un titolo "migliore". Fondamentalmente sarebbe davvero su chi è venuto prima o quale è più vicino all'immagine. – stwhite