Los selectores Scrapy , como sugiere el nombre, se utilizan para seleccionar algunas cosas. Si hablamos de CSS, también hay selectores presentes que se utilizan para seleccionar y aplicar efectos CSS a etiquetas y texto HTML.
En Scrapy, usamos selectores para mencionar la parte del sitio web que nuestras arañas rasparán. Por lo tanto, para extraer los datos correctos del sitio, es muy importante que seleccionemos las etiquetas que representan los datos correctamente. Hay muchas herramientas que se utilizan para eso.
Tipos de selectores:
En Scrapy, hay principalmente dos tipos de selectores, es decir, selectores CSS y selectores XPath. Ambos realizan la misma función y seleccionan el mismo texto o datos, pero el formato de pasar los argumentos es diferente en ellos.
- Selectores CSS: dado que los lenguajes CSS se definen en cualquier archivo HTML, podemos usar sus selectores como una forma de seleccionar partes del archivo HTML en Scrapy.
- Selectores de XPath: es un lenguaje utilizado para seleccionar Nodes en documentos XML y, por lo tanto, también se puede usar en archivos HTML, ya que los archivos HTML también se pueden representar como documentos XML.
Descripción:
Tengamos un archivo HTML (index.html) como se muestra a continuación, que vamos a desechar usando nuestra araña y ver cómo funcionan los selectores. Estaremos trabajando en Scrapy Shell para dar comandos para seleccionar datos.
HTML
<html> <head> <title>Scrapy-Selectors</title> </head> <body> <div id='Selectors'> <h1> This is H1 Tag </h1> <span class="SPAN1"> This is Class Selectors SPAN tag </span> </div> </body> </html>
A continuación se muestra una vista de nuestro Scrapy Shell que usaremos:
Comando para abrir shell:
Archivo Scrapy Shell: ///C:/Users/Dipak/Desktop/index.html
Uso de selectores:
Ahora discutiremos cómo usar los selectores en Scrapy. Dado que hay principalmente dos tipos, como se indica a continuación:
Selectores de CSS:
Hay varios formatos para usar selectores CSS en diferentes casos. Se dan a continuación:
- El inicio muy básico va desde la selección de las etiquetas básicas en el archivo HTML, como la etiqueta <HTML>, <HEAD>, <BODY>, etc. Por lo tanto, el siguiente formato es el formato básico para seleccionar cualquier etiqueta en el archivo HTML usando Scrapy.
Shell Command : response.css('html').get() # Here response object calls CSS selector method to # target HTML tag and get() method # is used to select everything inside the HTML tag.
- Entonces, ahora es el momento de modificar nuestra forma de seleccionar, si queremos seleccionar solo el texto interno de las etiquetas o simplemente queremos seleccionar el atributo de cualquier etiqueta en particular, podemos seguir la siguiente sintaxis:
# To select the text inside the Tags # excluding tags we have to use (::text) # as our extension. response.css('h1::text').get() # To select the attributes details of # any HTML tag we have to use below # given syntax: response.css('span').attrib['class']
- Si hay muchos tipos de etiquetas iguales en el archivo HTML, entonces podemos usar el método .getall() en lugar de .get() para seleccionar todas las etiquetas. Devuelve una lista de etiquetas seleccionadas y sus datos.
- Si la etiqueta que tenemos que seleccionar no se menciona en el archivo, los selectores de CSS no devuelven nada. También podemos proporcionar datos predeterminados que se devolverán si no se encuentra nada.
Selectores XPath:
La forma en que funcionan estos selectores es similar a la forma en que funcionan los selectores de CSS, en cambio, la sintaxis solo difiere.
Los siguientes son los recargos que se pueden escribir en XPATH para seleccionar, lo que hemos hecho anteriormente.
# This is to select the text part of # title tag using XPATH response.xpath('//title/text()') response.xpath('//title/text()').get() # This is how to select attributes response.xpath('//span/@class').get()
Propiedades:
1. Podemos anidar selectores unos dentro de otros. Dado que si nuestro archivo HTML puede contener elementos dentro de la etiqueta div, podemos anidar los selectores para seleccionar un elemento en particular en él. Para lograr esto, primero tenemos que seleccionar todos los elementos dentro de la etiqueta div, y luego podemos seleccionar cualquier elemento en particular.
div_tag = response.xpath('//div') div_tag.getall() for tags in div_tag: tag = tags.xpath('.//h1').get() print({tag})
2. A continuación, también podemos usar nuestros selectores con la expresión regular. Si no sabemos cuál es el nombre de los atributos o elementos, también podemos usar expresiones regulares para la selección. Para esto tenemos un método llamado ( .re()).
El método .re() se utiliza para seleccionar etiquetas en función de la coincidencia de contenido. Si el contenido dentro de la etiqueta HTML coincide con la expresión regular ingresada, este método devuelve una lista de ese contenido. En el archivo HTML anterior, tenemos dos etiquetas denominadas h1 y la etiqueta span dentro de la etiqueta DIV, y el texto en ambas etiquetas tiene el mismo comienzo, es decir, «Esto es». Entonces, para seleccionarlos en función de expresiones regulares, debemos formar su expresión regular, que se muestra a continuación:
expresión regular = r’This\sis\s*(.*)’ y tenemos que ingresar esto en nuestro método .re()
Entonces nuestro código se convierte en
respuesta.css(‘#Selectores *::texto’).re(r’Esto\sis\s*(.*)’)
3. Las expresiones regulares EXSLT también son compatibles con las arañas scrapy. Podemos usar su método para seleccionar los elementos en función de algunas expresiones regulares nuevas. Esta extensión proporciona dos espacios de nombres diferentes para usar en XPath
- re: Se utiliza para hacer expresiones regulares.
- conjunto: se utiliza para la manipulación de conjuntos
Podemos usar estos espacios de nombres para modificar la declaración de selección especificada en nuestro método Xpath.
A continuación se muestra uno de los ejemplos dados:
Supongamos que hemos agregado dos etiquetas h1 y nombramos su clase en nuestro archivo HTML, por lo que ahora se ve así:
HTML
<html> <head> <title>Scrapy-Selectors</title> </head> <body> <div id='Selectors'> <h1 class='FirstH1'> This is H1 Tag </h1> <h1 class='FirstH2'> This is Second H1 Tag </h1> <h1 class='FirstH'> This is Third H1 Tag </h1> <span class="SPAN1"> This is Class Selectors SPAN tag </span> </div> </body> </html>
Ahora, si queremos seleccionar ambas etiquetas H1 usando expresiones regulares, entonces podemos ver que tenemos que seleccionar esa etiqueta que tiene una string de inicio primero en la parte de identificación y el entero final no importa.
Así que el código para esto:
respuesta.xpath(‘//h1[re:test(@class, “FirstH\d$”)]’).getall()
Aquí estamos usando el método re:test para especificar y probar nuestra expresión regular en el atributo de clase de nuestra etiqueta h1 y regexp selecciona solo aquellas etiquetas h1 cuyos valores de atributo de clase terminan con un número entero.
4. Si queremos podemos usar ambos selectores combinados para mejorar la forma de seleccionar.
response.css('span').xpath('@class').get() # CSS is used to select tag and XPATH is # used to select attribute
Nota:
- En XPath, cuando usamos la propiedad de anidamiento de los selectores, debemos tener en cuenta un hecho con respecto a los XPath relativos. Considere que seleccionamos una etiqueta div como se indica a continuación:
div_tag = respuesta.xpath(‘//div’)
Esto seleccionará la etiqueta div y todos los elementos dentro de esa etiqueta. Ahora suponga que la etiqueta div contiene algunas etiquetas <a>dentro de ella. Ahora, si queremos usar selectores anidados y seleccionar la etiqueta <a>, escribiríamos
para a en div_tag.xpath(‘.//a’):
Esta es una ruta relativa que le dice a la araña que seleccione elementos de etiqueta solo de la ruta dentro de la etiqueta div seleccionada arriba. Si escribimos –
para una en div_tag(‘//a’):
Seleccionará todas las etiquetas dentro del documento HTML. Así que debemos cuidar las rutas relativas.
- Podemos usar la extensión de Google Chrome denominada SelectorGadget , que se usa para simplificar la tarea de selección. Ya que todos los sitios web hoy en día si los inspeccionamos, tienen códigos de búsqueda y de comprensión muy extensos y difíciles de entender. Entonces, en medio de ellos, podemos usar esta extensión que permite seleccionar las etiquetas solo en Frontend.
Publicación traducida automáticamente
Artículo escrito por harshkumarchoudhary144 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA