Соскребаешь ссылки с сайта, используя 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 не мог обработать эту разметку, которая указала, что с тегами что-то не так.