разбор странного html с помощью node.js

#node.js #html-parsing

#node.js #html-синтаксический анализ

Вопрос:

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

 <tr>
<td><font FACE=Tahoma color='#CC0000' size=2><b>Date</b></font></td>    
<td><font FACE=Tahoma color='#CC0000' size=2><b>Place</b></font></td>
<td><font FACE=Tahoma color='#CC0000' size=2><b>Situation</b></font></td>
</tr> 

<tr><td rowspan=2>16/09/2011 10:11</td><td>New York</td><td><FONT COLOR="000000">Situation Red</font></td></tr>
<tr><td colspan=2>Optional comment hello new york</td></tr>
<tr><td rowspan=2>16/09/2011 10:08</td><td>Texas</td><td><FONT COLOR="000000">Situation Green</font></td></tr>
<tr><td colspan=2>Optional comment hello texas </td></tr>
<tr><td rowspan=1>06/09/2011 13:14</td><td>California</td><td><FONT COLOR="000000">Yellow Situation</font></td></tr>
</TABLE>
  

Странная и сумасшедшая вещь — это комментарий, которого нет в заголовке таблицы, также начальная точка (Калифорния) не имеет комментариев. Итак, начальная точка всегда будет такой:

Дата: 06/09/2011 13:14

Место: Калифорния

Ситуация: Желтая ситуация

Комментарий: null

все остальные места имеют комментарий и будут выглядеть следующим образом:

Дата: 16/09/2011 10:11

Место: Нью-Йорк

Ситуация: Ситуация красная

Комментарий: необязательный комментарий привет, Нью-Йорк.

Я пробовал некоторые подходы, но у меня нет большого опыта с node.js и меньше с помощью синтаксического анализа HTML. Мне нужно начать с разбора сумасшедших вещей.

Комментарии:

1. попробуйте: github.com/tautologistics/node-htmlparser

Ответ №1:

Я создал распределенный скребок в node.js . Мне было проще разбирать HTML, который был проанализирован через html tidy.

Вот модуль для запуска html через tidy:

 var spawn = require('child_process').spawn;
var fs = require('fs');

var tidy = (function() {
this.html = function(str, callback) {
    var buffer = '';
    var error = '';

    if (!callback) {
        throw new Error('No callback provided for tidy.html');
    }
    var ptidy = spawn(
        'tidy',
        [
            '--quiet',
            'y',
            '--force-output',
            'y',
            '--bare',
            'y',
            '--break-before-br',
            'y',
            '--hide-comments',
            'y',
            '--output-xhtml',
            'y',
            '--fix-uri',
            'y',
            '--wrap',
            '0'
        ]);

    ptidy.stdout.on('data', function (data) {
        buffer  = data;
    });

    ptidy.stderr.on('data', function (data) {
        error  = data;
    });

    ptidy.on('exit', function (code) {
        //fs.writeFileSync('last_tidy.html', buffer, 'binary');
        callback(buffer);
    });

    ptidy.stdin.write(str);
    ptidy.stdin.end();      
}
return this;
})();

module.exports = tidy;
  

Пример (если сохранен как tidy.js ):

 require('./tidy.js');
tidy.html('<table><tr><td>badly formatted html</tr>', function(html) { console.log(html); });
  

Результат:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content="HTML Tidy for Linux/x86 (vers 25 March 2009), see www.w3.org" />
<title></title>
</head>
<body>
<table>
<tr>
<td>badly formatted html</td>
</tr>
</table>
</body>
</html>
  

Комментарии:

1. Я смог заставить этот модуль работать, используя require(‘htmltidy/htmltidy.js ‘) — просто к вашему сведению для всех, кто загружает его из npm 🙂