span extractfirst extract_first div attribute python xpath scrapy

python - extractfirst - Convierta el XPath obtenido del navegador a XPath utilizable para Scrapy



scrapy xpath div id (2)

El XPath generado a partir de un punto de inserción en un navegador está destinado a ser frágil porque hay muchas diferentes expresiones XPath posibles para llegar a un nodo dado, JavaScript puede modificar el HTML y el navegador no conoce sus intenciones.

Por el ejemplo que diste,

//*[@id="rg_s"]/div[13]/a/img

el decimotercero div es particularmente propenso a la rotura.

Intenta encontrar una característica de identificación única más cerca de tu objetivo. Un atributo @id único sería ideal, o una @class que identifica de forma única a su objetivo o un ancestro cercano de su objetivo también puede funcionar bien.

Por ejemplo, para Google Image Search, algo así como el siguiente XPath

//div[@id=''rg_s'']//img[@class=''rg_i'']"

seleccionará todas las imágenes de la clase rg_i dentro del div contiene los resultados de la búsqueda.

Si está dispuesto a abandonar el enfoque de copiar y pegar y aprender suficiente XPath para generalizar sus selecciones, obtendrá resultados mucho mejores. Por supuesto, las exenciones de responsabilidad estándar se aplican a los cambios en la presentación que también requieren la actualización de las técnicas de raspado. Usar una llamada API directa sería mucho más robusto (y apropiado también).

Este es un problema que siempre tengo obtener un XPath específico con mi navegador.

Supongamos que quiero extraer todas las imágenes de algunos sitios web, como Google Image Search o Pinterest. Cuando uso el Inspect element luego copy XPath para obtener el XPath de una imagen, me da algo como lo siguiente:

//*[@id="rg_s"]/div[13]/a/img

Lo obtuve de una imagen de la Búsqueda de Google. Cuando quiero usarlo en mi spider , utilicé Selector y HtmlXPathSelector con los siguientes XPaths, ¡pero ninguno de ellos funciona!

//*[@id="rg_s"]/div/a/img //div[@id="rg_s"]/div[13]/a/img //[@class="rg_di rg_el"]/a/img #i change this based on the raw html of page #hxs.select(xpath).extract() #Selector(response).xpath(''xpath'') . .

He leído muchas preguntas, pero no pude encontrar una respuesta general sobre cómo puedo usar XPaths obtenidos de un navegador web en Scrapy.


Por lo general, no es seguro y confiable seguir ciegamente la sugerencia del navegador sobre cómo ubicar un elemento.

En primer lugar, la expresión XPath que generan las herramientas de desarrollador suele ser absoluta, comenzando por la etiqueta html principal de los padres, lo que la hace más dependiente de la estructura de la página (bueno, firebug también puede hacer expresiones basadas en atributos de id ).

Además, el código HTML que ve en el navegador puede ser muy diferente de lo que recibe Scrapy debido a la naturaleza asincrónica de la carga de la página web y la ejecución dinámica de javascript en el navegador. Scrapy no es un navegador y "ve" solo el código HTML inicial de una página, antes de la parte "dinámica".

En su lugar, inspeccione lo que realmente tiene Scrapy en la respuesta: abra Scrapy Shell , inspeccione la respuesta y depure sus expresiones XPath y selectores de CSS:

$ scrapy shell https://google.com >>> response.xpath(''//div[@id="myid"]'') ...

Esto es lo que tengo para la búsqueda de imágenes de google:

$ scrapy shell "https://www.google.com/search?q=test&tbm=isch&qscrl=1" In [1]: response.xpath(''//*[@id="ires"]//img/@src'').extract() Out[1]: [u''https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRO9ZkSuDqt0-CRhLrWhHAyeyt41Z5I8WhOhTkGCvjiHmRiTSvDBfHKYjx_'', u''https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcQpwyzbW_qsRenDw3d4wwpwwm8n99ukMtLCVaPiTJxyviyQVBQeRCglVaY'', u''https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcSrxtoY3-3QHwhjc5Ofx8090uDYI8VOUbi3gUrd9USxZ-Vb1D5pAbOzJLMS'', u''https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTQO1A3dDJ07tIaFMHlXNOsOnpiY_srvHKJE1xOpsMZscjL3aKGxaGLOgru'', u''https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcQ71ukeTGCPLuClWd6MetTtQ0-0mwzo3rn1ug0MUnbpXmKnwNuuBnSWXHU'', u''https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRZmWrYR9A4W97jpjhtIbyUM5Lj3vRL0vgCKG_xfylc5wKFAk6UB8jiiKA'', ... u''https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRj08jK8sBjX90Tu1RO4BfZkKe5A59U0g1TpMWPFZlNnA70SQ5i5DMJkvV0'']