Cómo copiar texto de la tabla usando puppeteer en nodejs
Estoy tratando de extraer el texto OTP de HTML donde está dentro de una fila de la tabla y no hay un selector como div id o class. Solo el estilo div está presente. Cómo copiar texto de eso.
Estoy usando https://temp-mail.org/
Aquí está el XPATH del campo OTP
/html/body/main/div[1]/div/div[3]/div[2]/div/div[1]/div/div[2]/div[3]/div[2]/div/table/tbody/tr/td/div[2]/table/tbody/tr/td/div/table/tbody/tr/td/table/tbody/tr[3]/td/div
Aquí está el selector
body > main > div.container > div > div.col-sm-12.col-md-12.col-lg-12.col-xl-8 > div.tm-content > div > div.inboxWarpMain > div > div.inbox-data-content > div.inbox-data-content-intro > div:nth-child(13) > div > table > tbody > tr > td > div:nth-child(2) > table > tbody > tr > td > div > table > tbody > tr > td > table > tbody > tr:nth-child(3) > td > div
Imagen de estructura de código que se muestra en herramientas de desarrollo
Respuestas
Asegúrese siempre de no violar los Términos de uso del servicio realmente raspado. ¿Quizás podría lograr el resultado deseado si usara su API? (https://rapidapi.com/Privatix/api/temp-mail)
Si está seguro de que desea utilizar la automatización del navegador y procede a recuperar la contraseña de un solo uso con titiritero, entonces: puede utilizar el page.$evalmétodo para recuperar el contenido de texto de cualquier elemento con un selector válido.
Nota: lo que ya ha copiado de devtools como selector es en realidad un selector , no es obligatorio incluir una clase CSS o una identificación de elemento. Está totalmente bien (incluso si es un poco redundante).
P.ej:
const selector = 'body > main > div.container > div > div.col-sm-12.col-md-12.col-lg-12.col-xl-8 > div.tm-content > div > div.inboxWarpMain > div > div.inbox-data-content > div.inbox-data-content-intro > div:nth-child(13) > div > table > tbody > tr > td > div:nth-child(2) > table > tbody > tr > td > div > table > tbody > tr > td > table > tbody > tr:nth-child(3) > td > div'
const text = await page.$eval(selector, el => el.innerText)
console.log(text)
Salida:
233-552
Editar
En caso de que haya más de un elemento con el que el selector coincidiría, puede usar document.querySelectorAllenfoques como $$evalo $$luego seleccionar el elemento en el primer índice [0].
En este caso de uso exacto, el $está ocupado por jQuery, por lo que entra en conflicto con la $abreviatura de Chrome api querySelector, consulte aquí:
Soluciones:
const selector = 'body > main > div.container > div > div.col-sm-12.col-md-12.col-lg-12.col-xl-8 > div.tm-content > div > div.inboxWarpMain > div > div.inbox-data-content > div.inbox-data-content-intro > div:nth-child(13) > div > table > tbody > tr > td > div:nth-child(2) > table > tbody > tr > td > div > table > tbody > tr > td > table > tbody > tr:nth-child(3) > td > div'
await page.waitFor(10000) // waitForTimeout since pptr 5.3.0
try {
await page.waitForSelector(selector)
const [text] = await page.$$eval(selector, elements => elements.map(el => el.innerText))
console.log(text)
} catch (e) {
console.error(e)
}
// alternate solution with page.evaluate:
try {
const text = await page.evaluate(el => el.innerText, (await page.$$(selector))[0])
console.log(text)
} catch (e) {
console.error(e)
}