Кукольник - JQuery селектор не находит элемент на некоторых сайтах? - PullRequest
0 голосов
/ 02 июля 2019

Я недавно играл с puppeteer, с конечной целью научиться чистить Glassdoor для обзоров его компаний, и Я столкнулся со странной проблемой. По какой-то причине мой селектор JQuery (установленный здесь) никогда не может найти отзывы о холдинговой компании <div class="hreview">, несмотря на то, что логика очистки моего скрипта работает безупречно на другом сайте.

Сначала я проверил свой скрипт на хакерских новостях, и он успешно напечатал номер и название каждой статьи:

const puppeteer = require("puppeteer");
const fs = require('fs');

const $ = require('cheerio');

// Function to help with cheerio's JQuery down the line
function jq_helper(current_selector, child_element_name) {
  if (!$(current_selector).children(child_element_name).length) {
    console.log(`${child_element_name} does not exist`);
    return [];
  }

  else {
    var scraped_data = $(current_selector).children(child_element_name).text();
    console.log(scraped_data);
    return scraped_data;
  }
}


// puppeteer usage as normal
puppeteer.launch({ headless: false }).then(async browser => {

  const page = await browser.newPage()

  const navigationPromise = page.waitForNavigation()

  await page.setViewport({ width: 1440, height: 794 })  
  await page.goto('https://news.ycombinator.com/news')

  await navigationPromise

  var data = [];

  const html = await page.content();

  $(".athing", html).each(function() {

  console.log("\nMain scraping function underway.")

  // Getting number of each link
  var element1 = ".title[valign='top'][align='right']"
  var number = jq_helper(this, element1)
  data.push({'number': number})

  // Traversing to next level of descendants - getting title and link of each article
  current_level = $(this).children(".title:not([valign])")

  // Getting title and link of article
  var element2 = ".storylink"
  link = jq_helper(current_level, element2)
  data.push({'link': link})


         });


  fs.writeFile('scrape_hackernews.txt', JSON.stringify(data), (err) => {  
    // throws an error, you could also catch it here
    if (err) throw err;

    // success case, the file was saved
    console.log('\nFile saved!');
});


    await browser.close()

})

Однако приведенная выше логика очистки завершается с ошибкой glassdoor в приведенном ниже сценарии, и каждый выбранный html-элемент сообщается как отсутствующий:

const puppeteer = require("puppeteer");
const $ = require('cheerio');

const fs = require('fs');

// Function to help with cheerio's JQuery down the line
function jq_helper(current_selector, child_element_name) {
  if (!$(current_selector).children(child_element_name).length) {
    console.log(`${child_element_name} does not exist`);
    return [];
  }

  else {
    var scraped_data = $(current_selector).children(child_element_name).text();
    console.log(scraped_data);
    return scraped_data;  
  }
}


// puppeteer usage as normal
puppeteer.launch({ headless: false }).then(async browser => {

  const page = await browser.newPage()

  const navigationPromise = page.waitForNavigation()

  await page.setViewport({ width: 1440, height: 794 })  
  await page.goto('https://www.glassdoor.com/Reviews/Grubhub-Reviews-E419089.htm')

  await navigationPromise

  var data = [];


  const html = await page.content();
  $(".hreview", html).each(function() {

    console.log("\nMain scraping function happening.")

    // Getting date of review
    var element1 = ".d-flex justify-content-between"
    var date = jq_helper(this, element1);

    data.push({'date': date})

    // Traversing next level
    current_level = $(this).children(".row mt").children(".col-sm-11 pl-sm-lg mx-0")

    // Getting title
    var element2 = ".h2 summary strong mt-0 mb-xsm"
    var title = jq_helper(current_level, element2)

    data.push({'title': title})

    // Getting stars
    var element3 = ".mr-xsm d-lg-inline-block"
    var stars = jq_helper(current_level, element3)

    data.push({'stars': stars})

    // Getting employee info
    var element4 = ".d-lg-inline-block"
    var employee_info = jq_helper(current_level, element4)

    data.push({'employee_info': employee_info})

    // Traversing next level
    current_level = $(current_level).children("div")

    // Getting review sub-title
    var element5 = ".mainText mb-0"
    var title = jq_helper(current_level, element5)

    data.push({'title': title})

    // Traversing next level
    current_level = $(current_level).children(".description")

    // Getting all pieces of review
    var element6 = ".mt-md"
    var review = jq_helper(current_level, element6)

    data.push({'review': review})

  });


  fs.writeFile('scrape_example.txt', JSON.stringify(data), (err) => {  
    // throws an error, you could also catch it here
    if (err) throw err;

    // success case, the file was saved
    console.log('\nFile saved!');
});

  await browser.close()

})

Может ли кто-нибудь начать меня, чтобы мой сценарий мог найти первый элемент, который он ищет, и я мог бы пойти оттуда? Я не знаю, откуда эта ошибка.

Заранее благодарим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...