2012-05-19 9 views
5

Lo que estoy buscando hacer es esencialmente lo mismo que un botón Tweet o Facebook Compartir/Me gusta, y eso es rozar una página y la mayoría título relevante para una pieza de datos. El mejor ejemplo que puedo pensar es cuando estás en la página principal de un sitio web con muchos artículos y haces clic en el botón Me gusta de Facebook. A continuación, obtendrá la información adecuada para la publicación relativa al botón Me gusta (más cercano). Algunos sitios tienen etiquetas de Open Graph, pero otros no y aún funciona.raspar de forma remota la página y obtener el título o la descripción más relevante para imágenes con XPath

Como esto se hace de forma remota, solo tengo el control de los datos a los que quiero dirigirme. En este caso, los datos son imágenes. En lugar de recuperar solo el <title> de la página, estoy buscando de alguna manera atravesar el dom en reversa desde el punto de partida de cada imagen, y encontrar el "título" más cercano. El problema es que no todos los títulos ocurren antes de una imagen. Sin embargo, la probabilidad de que la imagen ocurra después del título en este caso parece bastante alta. Dicho esto, espero que funcione bien para casi cualquier sitio.

Pensamientos:

  • Encontrar el "contenedor" de la imagen y luego usar el primer bloque de texto.
  • Encuentra los bloques de texto en los elementos que contienen ciertas clases ("descripción", "título") o elementos (h1, h2, h3, h4).

copias de seguridad Título:

  • con Open Graph Etiquetas
  • utilizando sólo el <title>
  • El uso de etiquetas ALT solamente
  • El uso de etiquetas META

Resumen: La extracción de las imágenes no es el problema, es cómo obtener títulos relevantes para ellos.

Pregunta: ¿Cómo conseguirías títulos relevantes para cada una de las imágenes? Tal vez usando DomDocument o XPath?

+0

Honestamente, después de raspar con PHP, si podría transferirlo mediante llamadas REST a un pequeño servidor web Java, podría usar JSOUP para acceder fácilmente a todos esos elementos y atributos. JSOUP es como jQuery para Java y usa la misma sintaxis. ¡Ojalá estuviera disponible para PHP ya que haría desaparecer tu problema en segundos! – jmort253

+0

hay varias bibliotecas disponibles que se ocupan de la extracción de contenido de las páginas, aunque no conozco ninguna que se ocupe directamente de las imágenes. pero puede obtener algunas ideas y direcciones, o ser capaz de usarlas. aquí hay uno: http://code.google.com/p/boilerpipe/wiki/Components –

+1

Gracias por su opinión.He actualizado mi pregunta para apuntar más a la "lógica" detrás de obtener títulos o descripciones relevantes para cada imagen en lugar de cómo obtener las imágenes. – stwhite

Respuesta

1

Su enfoque parece lo suficientemente bueno, me gustaría darle un peso a ciertas etiquetas/atributos y recorrerlas con consultas XPath hasta que encuentre algo que sale y no es nulo. Algo así como:

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 ejemplo sencillo XPath (función 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; 
} 

y su uso actual:

$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

He estado leyendo sobre XPath y en realidad comencé a probar algunas opciones, pero ¿puede ampliar esto? Encontrar la distancia entre los nodos parece una buena idea, pero aún no he encontrado una solución. – stwhite

+0

@stwhite: En realidad, esa no fue mi idea, solo comienzas con el nivel más alto de especificidad (etiqueta 'img') y sigues subiendo, hasta que encuentres algo que quieras considerar como descriptivo. –

+0

Me di cuenta de que esta no era su idea inicial, pero ¿tiene alguna idea sobre cómo obtener la distancia entre los nodos encontrados? Por ejemplo, encontrar la posición de la imagen actual en un H1 anterior frente a la distancia de la imagen a un h2 anterior. Esto aparentemente daría una puntuación de la cual es más probable que sea un título "mejor". Básicamente, se trataría realmente de qué fue primero o cuál más cerca de la imagen. – stwhite

Cuestiones relacionadas