Извлечь текст со свернутыми пробелами из html, как он будет отображаться

Я использую парсер html (Neko), чтобы извлечь свободный текст html-документа. Поскольку меня интересует семантика текста, я должен уделить особое внимание расстоянию между словами, которое отображается в браузере.

Например:

<H1>My
title</H1>
<P>Hello
                World</P>

Отображается как:

My title
Hello world

При содержании абзаца внутри тегов <pre> или со стилем:

<style>
p { white-space:pre; }
</style>

будет результат:

My title
Hello
                    World

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

Есть ли способ извлечь текст с пробелами из html, когда он читается в браузере?


person Y_key    schedule 12.03.2013    source источник
comment
Попробуйте pre-wrap или pre-line, если это не работает должным образом, проблема не в опции pre, а в загрузке вашего css или чего-то еще.   -  person Kees Sonnema    schedule 12.03.2013
comment
Спасибо, но я хочу извлечь Hello World и Hello[ Spaces ]World из html-кода в соответствии с тем, как он отображается в браузере.   -  person Y_key    schedule 12.03.2013


Ответы (2)


Я раньше не использовал Neko, но вам нужно получить доступ к стилям элементов и посмотреть, установлено ли для свойства white-space значение pre, pre-wrap или preline.

  1. Если это либо pre, либо pre-wrap, замените любую группу пробелов в тексте одним пробелом.

  2. В противном случае, если pre-line, замените только группы пробелов/табуляции одним пробелом.

  3. В противном случае не изменяйте текст.

Вот пример использования JQuery: JSFiddle

JQuery

function getRenderedText(obj) {
    var text = obj.text();
    var renderedText;
    switch (obj.css('white-space')) {
        case 'pre':
        case 'pre-wrap':
            renderedText = text;
            break;
        case 'pre-line':
            renderedText = text.replace(/[ \t]+/,' ');
            break;
        default:
            renderedText = text.replace(/\s+/,' ');
    }
    return renderedText;
}
person thgaskell    schedule 12.03.2013
comment
Спасибо, что подтолкнули меня в правильном направлении. Я очень надеялся, что мне не нужно будет обращаться к стилям или искать теги ‹pre› и сворачивать пробелы на примененных элементах — я много искал что-то попроще, но теперь вижу, что из этого нет выхода. Итак, мой первый шаг — разобрать блоки стилей с помощью парсера css. Спасибо. - person Y_key; 12.03.2013

Просто взгляните на эту основную информацию о w3schools

http://www.w3schools.com/cssref/pr_text_white-space.asp

и немного лучше объяснить с примерами:

http://css-tricks.com/almanac/properties/w/whitespace/

я также думаю, что вы должны поместить привет в 1 <p> и мир в другом, чтобы эффект работал. в противном случае они оба идут вправо.

person Kees Sonnema    schedule 12.03.2013
comment
Извиняюсь. Наверное, я не был так ясен. Мой вопрос был не обо мне как о html-редакторе, пытающемся заставить браузер отображать текст так, как я хочу. Что я на самом деле пытаюсь сделать, так это взять html-файл и проанализировать его, чтобы извлечь текст, как он отображается в браузере (с последовательными пробелами или нет в зависимости от разных случаев) - person Y_key; 12.03.2013
comment
Хм. хорошо. я думаю, что я не совсем правильно понимаю. но есть еще один ответ выше меня. посмотрите, если это то, что вы ищете :) - person Kees Sonnema; 12.03.2013