парсинг HTML с Firefox - PullRequest
       10

парсинг HTML с Firefox

2 голосов
/ 13 февраля 2010
uri = 'http://www.nytimes.com/';
searchuri = 'http://www.google.com/search?';
searchuri += 'q='+ encodeURIComponent(uri) +'&btnG=Search+Directory&hl=en&cat=gwd%2FTop';
req = new XMLHttpRequest();
req.open('GET', searchuri, true);
req.onreadystatechange = function (aEvt) {
    if (req.readyState == 4) {
        if(req.status == 200) {
            searchcontents = req.responseText;
            myHTML = searchcontents;
            var tempDiv = document.createElement('div');
            tempDiv.innerHTML = myHTML.replace(/<script(.|\s)*?\/script>/g, '');
            parsedHTML = tempDiv;
            sitefound = sc_sitefound(uri, parsedHTML);
        }
    }
};
req.send(null);

function sc_sitefound(uri, parsedHTML) {
    alert(parsedHTML);
    gclasses = parsedHTML.getElementsByClassName('g');
    for (var gclass in gclasses) {
        atags = gclass.getElementsByTagName('a');
        alert(atags);
        tag1 = atags[0];
        htmlattribute1 =  tag1.getAttribute('html');
        if (htmlattribute1 == uri) {
            sitefound = htmlattribute1;
            return sitefound;
        }

    }
    return null;
}

parsedHTML - это элемент XULE
gclasses - это коллекция HTMLC

если в результатах поиска в Справочнике Google много делителей класса G, почему эти классы пусты?

1 Ответ

3 голосов
/ 13 февраля 2010
var tempDiv = document.createElement('div');

Если вы находитесь в среде XUL, это не создает узел элемента HTML: это будет элемент XUL. Поскольку свойство innerHTML является эксклюзивным для HTMLElement, а не для других XML Element s, установка innerHTML для tempDiv ничего не изменит (кроме добавления пользовательского свойства, содержащего строку HTML). Следовательно, внутри tempDiv нет элементов с классом «g» ... внутри вообще нет элементов.

Если в браузер загружен простой HTML-документ, вы можете попробовать использовать content.document.createElement, чтобы получить элемент-оболочку HTML, для которого будет доступен innerHTML. Это все еще не лучший способ проанализировать целую страницу HTML, потому что рассматриваемый документ может содержать <head> контент, который вы не можете поместить в div, и HTTP-заголовки, которые вы будете выбрасывать. Вероятно, лучше загрузить целевой файл в собственный объект HTMLDocument. Хороший способ сделать это - использовать iframe. См. эту страницу для примеров обоих этих подходов.

tempDiv.innerHTML = myHTML.replace(/<script(.|\s)*?\/script>/g, '');

Это семь оттенков не очень хорошей идеи для обработки HTML с помощью регулярных выражений; это может пойти не так во многих случаях, когда Google немного изменит разметку своей страницы. Пусть браузер вместо этого выполняет работу по синтаксическому анализу. Установка innerHTML не приводит к немедленному выполнению элементов скрипта (хотя дальнейшие манипуляции с DOM возможны); Вы можете выбрать ненужные элементы скрипта позже, если вам нужно. С подходом XUL iframe вы можете просто отключить JavaScript в iframe.

for (var gclass in gclasses) {

Цикл for...in предназначен для использования против объектов, используемых в качестве отображений. Он должен не использоваться для итерации последовательности (такой как Array, NodeList или в этом случае HTMLCollection), поскольку он не выполняет то, что вы ожидаете. Для повторения последовательностей придерживайтесь стандартного цикла в стиле C for (var i= 0; i<sequence.length; i++).

Вы также можете сделать добавление объявлений var для всех остальных локальных переменных.

...