Соскребаешь ссылки с сайта, используя Node.js, request и cheerio?

Я пытаюсь почистить ссылки на веб-сайте расписания моей школы, используя Node.js, request и cheerio. Однако мой код не достигает всех тематических ссылок.

Ссылка на сайт расписания курсов здесь.

Ниже мой код:

var express = require('express');
var request = require('request');
var cheerio = require('cheerio');

var app = express();

app.get('/subjects', function(req, res) {
  var URL = 'http://courseschedules.njit.edu/index.aspx?semester=2016s';

  request(URL, function(error, response, body) {
    if(!error) {
      var $ = cheerio.load(body);

      $('.courseList_section a').each(function() {
        var text = $(this).text();
        var link = $(this).attr('href');

        console.log(text + ' --> ' + link);
      });
    }
    else {
      console.log('There was an error!');
    }
  });
});

app.listen('8080');
console.log('Magic happens on port 8080!');

Мой вывод можно найти здесь.

Как видно из моего вывода, некоторые ссылки отсутствуют. Более конкретно, ссылки из разделов "A", "I (продолжение)" и R "(продолжение)". Это также первые разделы каждого столбца.

Каждый раздел содержится в своем собственном div с именем класса 'courseList_section', поэтому я не понимаю, почему '.courseList_section a' не перебирает все ссылки. Я что-то упускаю из виду? Любое понимание очень ценится.

Заранее спасибо!

1 ответ

Решение

Проблема не в вашем коде, а в том, что вы пытаетесь разобрать сайт. HTML-теги недействительны. Вы пытаетесь разобрать все внутри .courseList_section, но теги выглядят так.

<span> <!-- Opening tag -->
    <div class='courseList_section'>
      <a href='index.aspx?semester=2016s&ƒ=ACC '>ACC  - Accounting/Essex CC</a>
      </span> <!-- Invalid closing tag for the first span, menaing that .courseList_section will be closed instead

<!-- Suddenly this link is outside the .courseList_section tag, meaning that it will be ignored by cheerio -->
<a href='index.aspx?semester=2016s&subjectID=ACCT'>ACCT - Accounting</a>
  <!-- and so on -->

Решение. Получить все ссылки и игнорировать те, которые не связаны с каким-либо курсом.

var request = require('request');
var cheerio = require('cheerio');

var URL = 'http://courseschedules.njit.edu/index.aspx?semester=2016s';

request(URL, function(error, response, body) {
  if(error) { return  console.error('There was an error!'); }

  var $ = cheerio.load(body);

  $('a').each(function() {
    var text = $(this).text();
    var link = $(this).attr('href');

    if(link && link.match(/subjectID/)){
      console.log(text + ' --> ' + link);
    };
  });
});

В следующий раз попробуйте посмотреть прямо на HTML и посмотрите, все ли в порядке. Если он выглядит как ****, передайте его через HTML-элемент Beautifier и проверьте его еще раз. Даже beautifier не мог обработать эту разметку, которая указала, что с тегами что-то не так.

Другие вопросы по тегам