как очистить контент от разрыва строки на веб-страницах с помощью Cheerio

Добрый день всем.

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

Справочная информация: Я изучаю Javascript около 2–3 месяцев, поэтому могу задать несколько действительно забавных вопросов. Простите меня за это.

Цель: я хочу очистить данные со следующего сайта - и

Я хочу получить

  • Название веломагазина
  • Адрес веломагазина
  • Телефон магазина велосипедов

Мне удалось очистить эти данные, которые мне нужны, однако они находятся в группе html (не уверен, так ли это называть. Это код, который я использовал.

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

var url = 'http://www.togoparts.com/bikeshops/list_shops.php?country=MY';
request(url, function(err, resp, body) {
    if (err)
        throw err;
    $ = cheerio.load(body, {
        normalizeWhitespace: false
    });
    var doc = $("td[width='52%'].verdana1");
    doc.each(function() {
        var link = $(this);
        console.log(link.html());

   });
});

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

Вопрос: Как мне получить данные по отдельности?

Мне нужен заголовок ссылки, я пробовал `var link = $ (this) .attr ('href'); ' но не работает.

Мне также нужна информация (адрес велосипедного магазина) после разрыва строки - я понятия не имею, как это понимать.

Вопрос2: Я пробовал следующее var doc = $("td[width='52%'] .verdana1"); - обратите внимание на пробел перед .verdana1 - это дает мне только название веломагазинов, которые я хотел, чем это отличается от var doc = $("td[width='52%'].verdana1");

и если я использую этот var doc = $("td[width='52%'] .verdana1"); - как я могу получить данные об адресе магазина велосипедов?

Большое спасибо за чтение, я пытался решить эту проблему во время китайского Нового года, и это сводит меня с ума :(. Я с нетерпением жду возможности поучиться у вас, ребята.

Брайан


person bosslee    schedule 01.02.2014    source источник
comment
Хороший вопрос. Одно уточнение, когда вы говорите заголовок ссылки, вы имеете в виду адрес (url), на который ссылается правильно? например, в чем-то вроде <a href='someurl.com'>something here</a> вы имеете в виду значение href?   -  person Pawel Miech    schedule 01.02.2014
comment
Привет, @Pawelmhm Спасибо за вопрос :) На самом деле я смотрю на заголовок здесь что-то, а не на заголовок href = Спасибо.   -  person bosslee    schedule 02.02.2014


Ответы (1)


В случае ссылок вы можете сначала найти их в своем документе, а затем зарегистрировать все атрибуты href:

var doc = $("td[width='52%'].verdana1");
links = doc.find('a');
links.each(function (i,elem) {
    console.log(elem.attribs.href);
})

Это будет регистрировать все значения атрибута href.

Когда дело доходит до адресов, это сложнее, потому что они семантически не различаются в DOM, они также являются дочерними элементами ячеек таблицы, поэтому вам нужны вложенные циклы, но вы можете получить к ним доступ, просмотрев элемент типа text.

doc.each(function (i,elem) {
    # elem here is table cell
    elem.children.forEach(function (child,i) {
       # now all children of table cell (i.e links,spans,divs and just text)
       if (child.type == "text") {
            console.log(child.data);
       }
    })
});

Надеюсь, это поможет.

person Pawel Miech    schedule 01.02.2014
comment
Спасибо @Pawelmhm. Ваш ответ мне очень помог, он помог мне решить не менее 80% моего вопроса. Я почти понял. Я хотел бы услышать ваш совет о том, как удалить ‹br› в child.data. С вашей помощью я могу получить адрес и телефон на другом объекте. Но ‹br› или пустое пространство также является объектом. Я приложил суть сюда для справки. - person bosslee; 02.02.2014
comment
Привет, @Pawelmhm, извините за повторное сообщение: D Мне удалось решить напоминание 20%. Большое вам спасибо. - person bosslee; 02.02.2014