Soy nuevo en el desarrollo web y no sé cómo recuperar el contenido de 4 URL del mismo sitio web, siempre obtengo valores vacíos. Estoy usando flutter y el paquete web_scraper: ^ 0.0.8

Necesito recuperar títulos, imágenes, descripciones y URL del sitio, las páginas por las que navegaré son:

https://datassette.org/revistas (Categorías)

https://datassette.org/revistas/videogames (Seleccione el idioma de las revistas)

https://datassette.org/revistas/br-brasil (revista (título, imagen y url))

https://datassette.org/revistas/ acao-games / semana-em-acao-especial-games-no-1 (título de la revista, descripción, imagen, url del pdf).

¿Qué es el método .getElement?

 /// Returns List of elements found at specified address.
  /// Example address: "div.item > a.title" where item and title are class names of div and a tag respectively.
  List<Map<String, dynamic>> getElement(String address, List<String> attribs) {
    // Attribs are the list of attributes required to extract from the html tag(s) ex. ['href', 'title'].



import 'package:web_scraper/web_scraper.dart';

class WebScraperHelper {

  static final webScraper = WebScraper('https://datassette.org');

  static Future<void> getData() async{

    if (await webScraper.loadWebPage('/revistas')) {

    // it prints the full html
    //print("getPageContent: ${webScraper.getPageContent()}");

      List<Map<String, dynamic>> images = webScraper.getElement(
          'img.width-full.wt-height-full.display-block.position-absolute',
          ['src']);

      List<Map<String, dynamic>> descriptions = webScraper.getElement(
          'h3.text-gray.text-truncate.mb-xs-0.text-body', ['title']);

      List<Map<String, dynamic>> urls = webScraper.getElement(
          'div > ul > li > div > a',
          ['href', 'title']);

    print("images: $images"); // print []
    print("descriptions: $descriptions"); // print []
    print("urls: $urls"); // print []

    }

  }

}
0
djalmafreestyler 20 feb. 2021 a las 21:35

2 respuestas

La mejor respuesta

Después de horas de pruebas, encontré una manera de recuperar todos los datos que necesito.

static Future<void> getMagazines() async {

    if (await webScraper.loadWebPage('/revistas/acao-games')) {

      List<Map<String, dynamic>> maps = [];

      List<Map<String, dynamic>> titles = webScraper.getElement(
          'span.field-content > a',
          []
      );

      // adicionar somente  os mapas que tiverem dado no atributo title

      List<Map<String, dynamic>> urls = webScraper.getElement(
          'div.field-content > a',
          [ 'href']
      );

      List<Map<String, dynamic>> images = webScraper.getElement(
          'div.field-content > a > img',
          [ 'src']
      );

      for(int i=0; i < urls.length; i++){

        maps.add({
          "title": titles[i]["title"],
          "url" : urls[i]["attributes"]["href"],
          "image" : images[i]["attributes"]["src"],
        });

      }

      //print("TITLES: $titles");
      //print("URLS: $urls");
      //print("IMAGES: $images");
      print(maps.length);


    }
0
djalmafreestyler 21 feb. 2021 a las 17:00

No uso ese paquete, me siento más cómodo usando expresiones regulares, aquí un ejemplo:

import 'dart:async';

import 'package:_samples2/networking.dart';


// get Categories
const kUrlRevistas = 'https://datassette.org/revistas';

var regExp1 = RegExp(r'<a href="\/revistas\/\p{L}+">(\p{L}+)<\/a>', unicode: true);

class Revistas {
  static Future fetchRevistas () async {
    print('Start fetching...');
    return await NetService.getRaw(kUrlRevistas)
      .whenComplete(() => print('Fetching done!'));
  }
}

void main(List<String> args) async {
  var data = await Revistas.fetchRevistas();
  var matches = regExp1.allMatches(data);
  
  print(matches.map((e) => e.group(1)).toList());
}

Resultado:

Start fetching...
Fetching done!
[Diversas, Eletrônica, Informática, Videogames]

P.D .: Necesita leer el código HTML.

0
Ουιλιαμ Αρκευα 20 feb. 2021 a las 21:20