tutorial scraping medium libreria con python selenium selenium-webdriver

python - scraping - Selenium webdriver: ¿Cómo encuentro TODOS los atributos de un elemento?



selenium con python (3)

En el módulo Python Selenium, una vez que tengo un objeto WebElement puedo obtener el valor de cualquiera de sus atributos con get_attribute() :

foo = elem.get_attribute(''href'')

Si el atributo llamado ''href'' no existe, se devuelve None.

Mi pregunta es, ¿cómo puedo obtener una lista de todos los atributos que tiene un elemento? No parece haber un get_attributes() o get_attribute_names() .


A continuación, obtengo una lista de todos los atributos y sus valores (a veces traducidos a cadenas de caracteres), utilizando al menos el controlador PhantomJS o Chrome:

elem.get_property(''attributes'')[0]

Para obtener los nombres:

x.get_property(''attributes'')[0].keys()


Aquí está mi intento de respuesta. Solo lo probé en el cuadro de búsqueda de la página de inicio de google. Utilicé la respuesta de @ alecxe anterior sobre ''outerHTML'' Después de haber obtenido el html, utilicé una expresión regular ([az]+-?[az]+_?)=''?"? Para que coincida con los nombres de los atributos. Regex simplemente tendría que modificarse para que coincida con un número cada vez mayor de casos. Pero el nombre esencial que necesitamos es "lo que esté detrás del signo igual".

Dado un elemento web

def get_web_element_attribute_names(web_element): """Get all attribute names of a web element""" # get element html html = web_element.get_attribute("outerHTML") # find all with regex pattern = """([a-z]+-?[a-z]+_?)=''?"?""" return re.findall(pattern, html)

Pruébalo en el siguiente código

import re from selenium import webdriver driver = webdriver.Firefox() google = driver.get("http://www.google.com") driver.find_element_by_link_text("English").click() search_element = driver.find_element_by_name("q") get_web_element_attribute_names(search_element)

salida:

[''class'', ''id'', ''maxlength'', ''name'', ''autocomplete'', ''title'', ''value'', ''aria-label'', ''aria-haspopup'', ''role'', ''aria-autocomplete'', ''style'', ''dir'', ''spellcheck'', ''type'']


No es posible utilizar una API de selenium webdriver, pero puede ejecutar un código de JavaScript para obtener todos los atributos :

driver.execute_script(''var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;'', element)

Manifestación:

>>> from selenium import webdriver >>> from pprint import pprint >>> driver = webdriver.Firefox() >>> driver.get(''https://.com'') >>> >>> element = driver.find_element_by_xpath(''//div[@class="network-items"]/a'') >>> attrs = driver.execute_script(''var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;'', element) >>> pprint(attrs) {u''class'': u''topbar-icon icon-site-switcher yes-hover js-site-switcher-button js-gps-track'', u''data-gps-track'': u''site_switcher.show'', u''href'': u''//stackexchange.com'', u''title'': u''A list of all 132 Stack Exchange sites''}

Para completar, una solución alternativa sería obtener el HTML outerHTML la etiqueta y analizar los atributos con un analizador HTML. Ejemplo (usando BeautifulSoup ):

>>> from bs4 import BeautifulSoup >>> html = element.get_attribute(''outerHTML'') >>> attrs = BeautifulSoup(html, ''html.parser'').a.attrs >>> pprint(attrs) {u''class'': [u''topbar-icon'', u''icon-site-switcher'', u''yes-hover'', u''js-site-switcher-button'', u''js-gps-track''], u''data-gps-track'': u''site_switcher.show'', u''href'': u''//stackexchange.com'', u''title'': u''A list of all 132 Stack Exchange sites''}