He intentado todo lo que puedo pensar. Puedo obtener postUrl, fecha, título, precio y ubicación. Si va a https://sandiego.craigslist.org/search/sss?query=surfboards y pega el fragmento de código a continuación en la consola, obtendrá todas las imágenes. Pero cuando intento acceder a mi código, vuelve indefinido. ¡Cualquier ayuda en esto sería muy apreciada!
$('#search-results > li').each((index, element) => { console.log( $(element).children().find('img').attr('src') ) })
import axios from 'axios' import request from 'request-promise' import cheerio from 'cheerio' import express from 'express' import path from 'path' const __dirname = path.resolve(); const PORT = process.env.PORT || 8000; const app = express(); app.get('', (req, res) => { res.sendFile(__dirname + '/views/index.html') }); const surfboards = []; axios("https://sandiego.craigslist.org/search/sss?query=surfboards") .then(res => { const htmlData = res.data; const $ = cheerio.load(htmlData); $('#search-results > li').each((index, element) => { const postUrl = $(element).children('a').attr('href'); const date = $(element).children('.result-info').children('.result-date').text(); const title = $(element).children('.result-info').children('.result-heading').text().trim(); const price = $(element).children('.result-info').children('.result-meta').children('.result-price').text(); const location = $(element).children('.result-info').children('.result-meta').children(".result-hood").text().trim(); // Why is this not working?!?!?!?!?! const img = $(element).children().find('img').attr('src'); surfboards.push({ title, postUrl, date, price, location, img }) }) return surfboards }).catch(err => console.error(err)) app.get('/api/surfboards', (req, res) => { const usedboards = surfboards return res.status(200).json({ results: usedboards }) }) // Make App listen app.listen(PORT, () => console.log(`Server is listening to port ${PORT}`))
Parece que la página configura las imágenes con JavaScript. Por lo tanto axios
obtiene el HTML sin enlaces reales a las imágenes.
Pero parece haber una solución aquí. Puede generar enlaces a imágenes concatenando https://images.craigslist.org y el valor de data-ids
de a
etiqueta principal.
Puede obtener los data-ids
esta manera:
var data_ids = $(element).children('a').attr('data-ids')
luego divídalo en una matriz por coma, elimine los dos primeros 3:
símbolos y concatene así:
`${img_base_url}/${ids}_${resolution_and_extension}`
Pero si necesita obtener la URL solo para la primera imagen, entonces no es necesario crear una nueva matriz cada vez. Use una subcadena en su lugar (tenga en cuenta que a veces li
no tiene ninguna imagen):
if (data_ids && data_ids.includes(',')) { data_ids.substring(data_ids.indexOf('3:') + 2, data_ids.indexOf(',')) } else if (data_ids) { data_ids.substring(data_ids.indexOf('3:') + 2, data_ids.length) }