2

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

Они следуют этой основной схеме:

<ul>
     <li class="name"><a href="spot.html">Spot</a></li>
     <li class="type">Dog</li>
     <li class="color">Red</li>
</ul>
<ul>
     <li class="name"><a href="mittens.html">Mittens</a></li>
     <li class="type">Cat</li>
     <li class="color">Brown</li>
</ul>
<ul>
     <li class="name"><a href="squakers.html">Squakers</a></li>
     <li class="type">Little Parrot</li>
     <li class="color">Rainbow</li>
</ul>

Это очень последовательно.

Мне нужно извлечь строку из li.name a (так, "Spot"), но только если type "Dog" или "Parrot", и поместить их в электронную таблицу.

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

2 ответа2

7

Не используйте Regex для анализа XML или HTML, используйте синтаксический анализатор XML или HTML.

Другой подход - конвертировать XML или HTML в текст, а затем использовать grep.

См. Приложение для извлечения тегов XML из документа.
См. Есть ли в RedHat собственный инструмент для анализа XML-файлов?
См. Сценарии: что проще всего извлечь значение в теге файла XML?

4

Вот реализация JavaScript, которая фактически использует DOM, проверяет класс type и записывает класс name если класс type содержит соответствующее слово. Если необходимо больше type s, просто добавьте их в переменную searchfor с помощью разделительной трубы (|).

var searchfor = /Dog|Parrot/gi;

var win = window.open();

var lists = document.body.getElementsByTagName("ul");

for (i in lists) {
    var points = lists[i].getElementsByTagName("li");

    for (j in points) {
        if ((" " + points[j].className + " ").indexOf(" " + "type" + " ") > -1) {
            if (points[j].innerHTML.match(searchfor) != null) {
                for (k in points) {
                    if ((" " + points[k].className + " ").indexOf(" " + "name" + " ") > -1) {
                        win.document.writeln(points[k].innerHTML + "<br />");

                        break;
                    }
                }
            }
        }
    }
}

Протестировано на jsFiddle: http://jsfiddle.net/wdR5Y/

Самый простой способ его использования - преобразовать его в букмарклет с чем-то вроде этого: http://userjs.up.seesaa.net/js/bookmarklet.html

Как и JavaScript, он не зависит от операционной системы и поддерживается большинством популярных веб-браузеров.

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


Если бы это было удостоверение личности, а не класс, это было бы немного проще ... ну, хорошо. Благодарим за ответ переполнения стека для получения элемента по имени класса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .