Aquí está el código html de la página que estoy tratando de analizar. (Es una librería) Parte del código de la página
<tr><tr> <tr><tr> <tr><tr> <tr><tr> <tr><tr> <tr> <td width="300" class="highlight"> <b>Издатель:</b> Додо Пресс,Фантом Пресс </td> </tr> <tr><tr> <tr><tr> <tr><tr>Necesito obtener el texto que sigue
<b>Издатель:</b> (traducción - Editor)
Primero usé nextsibling de BeautifulSoup, funcionó bien, pero en las páginas de otros libros en el mismo sitio, el elemento del editor no siempre está en el mismo lugar, lo que significa que mi cadena de próximos hermanos no obtiene la parte correcta de la descripción del libro.
Traté de localizar el texto exacto 'Издатель:' con Selenium
pubs = driver.find_element(By.XPATH, "//*[text()='Издатель:']")e hizo el trabajo. Recibí el texto 'Издатель:'. Después de eso, traté de ubicar el siguiente elemento después de 'Издатель:' porque el texto que necesito siempre se encuentra después de 'Издатель:'.
la followingsibling forma de hermano Selenium no funciona porque el nombre de los editores no tiene clase o etiqueta, etc.
También intenté ejecutar JS
pubs = driver.find_element(By.XPATH, "//*[text()='Издатель:']") pub = driver.execute_script(""" return arguments[0].nextElement""", pubs) pub = driver.execute_script("return document.evaluate('// [text()='Издатель:']/following-sibling::text()[1]'), document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.textContent;")Tampoco funcionó.
El elemento del editor no tiene ningún elemento hermano o hijo, por lo que no sé cómo obtener el texto que lo sigue.
URL del sitio: https://www.bgshop.ru/Catalog/GetFullDescription?id=10652263&type=1
El texto Додо Пресс, Фантом Пресс está dentro de un nodo de texto , por lo que debe usar execute_script() induciendo a WebDriverWait para element_to_be_clickable() y puede usar cualquiera de las siguientes estrategias de localización :
Bloque de código:
driver.get("https://www.bgshop.ru/Catalog/GetFullDescription?id=10652263&type=1") WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.collapsed"))).click() print(driver.execute_script('return arguments[0].lastChild.textContent;', WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[text()='Издатель:']//ancestor::td[1]")))).strip()) driver.quit()Salida de la consola:
Додо Пресс,Фантом ПрессPuede encontrar un par de discusiones detalladas relevantes en:
Puede lograr esto con el código javascript a continuación. Puede seleccionar cada elemento b y luego obtener su elemento principal y acceder a la propiedad innerText
document.querySelectorAll('b').forEach( element => { console.log(element.parentElement.innerText) }) <table> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr> <td width="300" class="highlight"> <b>Publisher:</b> name 1 </td> </tr> <tr></tr> <tr></tr> <tr></tr> <tr> <td width="300" class="highlight"> <b>Publisher:</b> name 2 </td> </tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr> <td width="300" class="highlight"> <b>Publisher:</b> name 3 </td> </tr> </table> Si hay otras etiquetas b , puede verificar con la declaración si el contenido de b es el editor que se encuentra a continuación.
document.querySelectorAll('b').forEach( element => { if(element.innerText == 'Publisher:'){ console.log(element.parentElement.innerText); } }) <table> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr> <td width="300" class="highlight"> <b>Publisher:</b> name 1 </td> </tr> <tr></tr> <tr> <td width="300" class="highlight"> <b>Date:</b> Date 1 </td> </tr> <tr></tr> <tr></tr> <tr> <td width="300" class="highlight"> <b>Publisher:</b> name 2 </td> </tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr></tr> <tr> <td width="300" class="highlight"> <b>Publisher:</b> name 3 </td> </tr> </table>