Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Парсинг данных страницы

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте здешние жители.
В HTML программировании я ничего не понимаю, поэтому прошу конкретной помощи в редактировании кода.
Есть код получения данных:
 

Код:
 
function MeteonovaSearchCityCode(LocCode)
{
    var location = "http://services.gismeteo.ru/inform-service/inf_chrome/cities/?startsWith=magadan";
 
    clearResults();
 
    var tmp = new ActiveXObject("Microsoft.XMLHTTP");
    tmp.open("GET", location, true);
    tmp.onreadystatechange=function()
    {
        if (tmp.readyState==4)
            {
                if (tmp.Status == 200) MeteonovaParseCityResults(tmp.responseXML);
                else {document.getElementById("loccode").value = lng_NoData; return;}
            }
    }
    tmp.Send(null);
}
 
 
//////////////////
 
 
function MeteonovaParseCityResults(xmlData)
{
    tempNode = xmlData.getElementsByTagName("./document").item(0);
    tempNodes = tempNode.getElementsByTagName('item');
    for (count = 0; count < tempNodes.length; count++) {
        var option = document.createElement("OPTION");
        cityNode = tempNodes[count];
        option.value = cityNode.getAttribute("id");
        option.innerText = cityNode.getAttribute("n") + ", " + cityNode.getAttribute("district_name");
        results.appendChild(option);
    }
hide("load_indicator");    
}
 
 

 
Данный код получает список городов в XML формате и выводит в виде строк. Теперь нужно получать данные из другого источника, а он уже в JSON формате, что для меня является проблемой. Должно получиться что-то примерно:
 

Код:
 
function MeteonovaSearchCityCode(LocCode)
{
    var location = "http://www.meteonova.ru/proxy.php?lang=en&searchby=cities&fchar=magadan";
 
    clearResults();
 
    var tmp = new ActiveXObject("Microsoft.XMLHTTP");
    tmp.open("GET", location, true);
    tmp.onreadystatechange=function()
    {
        if (tmp.readyState==4)
            {
                if (tmp.Status == 200) MeteonovaParseCityResults(tmp.responseXML);
                else {document.getElementById("loccode").value = lng_NoData; return;}
            }
    }
    tmp.Send(null);
}
 
 
//////////////////
 
 
function MeteonovaParseCityResults(xmlData)
{
???????
??????
        option.value = ??????
        option.innerText = ???????
        results.appendChild(option);
    }
hide("load_indicator");    
}
 
 

 
Подскажите решение.
 
Спасибо.

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 11:44 16-10-2019 | Исправлено: Aleksandr N, 11:53 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N
ну есть же тема - вопросы по javascript
я бы рекомендовал использовать jQuery - сильно упрощает жизнь
 

Цитата:
а он уже в JSON формате, что для меня является проблемой.

JSON.parse
https://developer.mozilla.org/ru/docs/Learn/JavaScript/Объекты/JSON
https://learn.javascript.ru/json#json-parse
 
более того, ваш код будет работать только в старых IE - именно этого хотите?

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 16:51 16-10-2019 | Исправлено: Mavrikii, 19:40 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Я не был точно уверен в ту-ли тему. А как и что парсить я-бы нашёл сам, но не уверен выйдет ли, поэтому просил готовое решение. Без всяких дополнительных модулей. Просто хочу по-быстрому подремонтировать гаджет погоды. Мне этого будет достаточно. И в пределах указанной процедуры. Что-бы не писать всё заново на языке которого не знаю. Был-бы Паскаль...

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 20:10 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
Мне этого будет достаточно.

JSON.parse, как и написал - преобразует строку json в объект или массив (зависит от содержимого). Далее идет работа с ним именно как с объектом или массивом. Точнее не скажу - нужно видеть что возвращается.
 
ps: посмотрел, это объект.
https://jsfiddle.net/L2cdw03v/
но ваш код не будет работать
1) не в IE
2) в современных браузерах, так как кроссдоменные ajax запросы запрещены (если удаленный сервер не возвращает специальный заголовок)

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 20:15 16-10-2019 | Исправлено: Mavrikii, 20:18 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Как ни странно, на этой-же странице уже парсится успешно JSON и всё работает. Правда делается всё непонятным мне способом. Так что думаю это возможно сделать как-то простым способом.

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 20:28 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
на этой-же странице уже парсится успешно JSON и всё работает.

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

Цитата:
Правда делается всё непонятным мне способом

ну каким непонятным - я же дал ссылку на описание что такое JSON и как с ним работают в javascript.
функция JSON.parse преобразует JSON строку в ее представление в javascript.
в данном случае это объект с атрибутами, поэтому обращение к ним идет через точку.
 
 
то есть вместо cityNode.getAttribute("district_name") пишите cityNode.district_name и так далее
но там возвращается только один объект, а не массив...

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 20:31 16-10-2019 | Исправлено: Mavrikii, 20:43 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Вот это точно работает, о чём я и говорил. Нужно что-то подобное сделать.

Код:
function AutomaticallySearchCity()
{
 
    var locationip = "http://www.geoplugin.net/json.gp";
 
    var tmp = new ActiveXObject("Microsoft.XMLHTTP");
        tmp.open("GET", locationip, true);
        tmp.onreadystatechange=function()
        {
        if (tmp.readyState==4)
            {
            if (tmp.Status == 200) {
                var geoipdata = tmp.responseText;
                geoipdata = geoipdata.split('",');
                var citybyip = geoipdata[2];
                citybyip = citybyip.substring(citybyip.indexOf('"geoplugin_city":"') + 18, citybyip.length);
                var countrybyip = geoipdata[7];
                countrybyip = countrybyip.substring(countrybyip.indexOf('"geoplugin_countryName":"') + 25, countrybyip.length);
                
            if (citybyip && countrybyip) {
                if (GetSourceOfUpdates.value == "weatherchannel") WeatherChannelSearchCityCode(citybyip + ", " + countrybyip);
                if (GetSourceOfUpdates.value == "accuweather") AccuSearchCityCode(citybyip + ", " + countrybyip);
                if (GetSourceOfUpdates.value == "wunderground") WUndergroundSearchCityCode(citybyip);
                if (GetSourceOfUpdates.value == "msn") MSNSearchCityCode(citybyip + ", " + countrybyip);
                if (GetSourceOfUpdates.value == "weathereye") WeatherEyeSearchCityCode(citybyip);
                if (GetSourceOfUpdates.value == "weatherbug") WeatherBugSearchCityCode(citybyip + ", " + countrybyip);
            }
 
            var locationip = "http://export.yandex.ru/bar/reginfo.xml?rnd=" + Math.random();
            var geoipdata = loadXmlDoc(locationip);
            var citybyip = geoipdata.getElementsByTagName('title')[0].firstChild.nodeValue;
    
            if (citybyip) {        
                if (GetSourceOfUpdates.value == "yandex") YandexSearchCityCode(citybyip);
                if (GetSourceOfUpdates.value == "gismeteo") GismeteoSearchCityCode(citybyip);
                if (GetSourceOfUpdates.value == "meteonova") MeteonovaSearchCityCode(citybyip);
            }
            }
            }                
        }
 
        tmp.Send(null);
}
 
 

 
Как пример привёл. Можно как-то сделать.
 
Добавлено:
Вот не смогу сам сделать, лучше готовым кодом в указанную функцию.

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 20:42 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Код:
function MeteonovaParseCityResults(json)
{
    data = JSON.parse('[' + json + ']');
    for (count = 0; count < data.length; count++) {
        var option = document.createElement("OPTION");
        cityNode = data[count];
        option.value = cityNode.id;
        option.innerText = cityNode.name + ", " + cityNode.d_name;
        results.appendChild(option);
    }
hide("load_indicator");    
}


Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 20:49 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Не знаю что не так, визуально как-бы всё правильно. Вставил функцию, но бесконечно крутится индикатор поиска и ничего не происходит... Может сам гаджет погоды поможет?

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 21:30 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
Не знаю что не так, визуально как-бы всё правильно

открываем консоль браузера, читаем сообщения.
ну и передавать нужно не tmp.responseXML, а tmp.ResponseText

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 21:33 16-10-2019 | Исправлено: Mavrikii, 21:34 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
не tmp.responseXML, а tmp.ResponseText

Аналогино, ничего не происходит хорошего.

Цитата:
открываем консоль браузера, читаем сообщения.

Если-бы это был-бы Паскаль, то я-бы не спрашивал здесь что и как, для меня это тёмный лес.

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 21:43 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
здесь что и как, для меня это тёмный лес

какой браузер? и показываем код, может что написали не так.

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 21:44 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вынь7х64 IE11. Это гаждет, придётся его поставить чтоб увидеть что и как. В файл meteonovasettings.js уже вставил новый код. На картинке отмечено что нужно делать.
Выложил: https://cloud.mail.ru/public/3WMV/2FgKMRb1q

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 22:07 16-10-2019 | Исправлено: Aleksandr N, 22:14 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
придётся его поставить чтоб увидеть что и как.

опции все равно не показываются, только пустое окно.
   
 
как минимум - не закрыли функцию

Код:
hide("load_indicator");
 
/////////////////////

где тут закрывающая фигурная скобка??
 
плюс

Код:
LocCode + ";

зачем тут одинокая кавычка??
 

Код:
function MeteonovaSearchCityCode(LocCode)
{
//    var location = "http://services.gismeteo.ru/inform-service/inf_chrome/cities/?startsWith=" + LocCode + "&lang=en";
    var location = "http://www.meteonova.ru/proxy.php?lang=en&searchby=cities&fchar=" + LocCode;
 
        clearResults();
 
    var tmp = new ActiveXObject("Microsoft.XMLHTTP");
    tmp.open("GET", location, true);
    tmp.onreadystatechange=function()
    {
        if (tmp.readyState==4)
            {  console.log(tmp);
                if (tmp.Status == 200) MeteonovaParseCityResults(tmp.responseText);
                else {document.getElementById("loccode").value = lng_NoData; return;}
            }
    }
    tmp.Send(null);
}
 
 
//////////////////
 
 
function MeteonovaParseCityResults(xmlData)
//{
//    tempNode = xmlData.getElementsByTagName("./document").item(0);
//    tempNodes = tempNode.getElementsByTagName('item');
//    for (count = 0; count < tempNodes.length; count++) {
//        var option = document.createElement("OPTION");
//        cityNode = tempNodes[count];
//        option.value = cityNode.getAttribute("id");
//        option.innerText = cityNode.getAttribute("n") + ", " + cityNode.getAttribute("district_name");
//        results.appendChild(option);
//    }
//hide("load_indicator");    
//}
{
    data = JSON.parse('[' + xmlData + ']');
    for (count = 0; count < data.length; count++) {
        var option = document.createElement("OPTION");
        cityNode = data[count];
        option.value = cityNode.id;
        option.innerText = cityNode.name + ", " + cityNode.d_name;
        results.appendChild(option);
    }  
    hide("load_indicator");
}

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 22:25 16-10-2019 | Исправлено: Mavrikii, 22:36 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
опции все равно не показываются, только пустое окно

Даже не знаю почему такое, у меня на трёх машинах работает, в том числе и на Вынь10. Остальное, пардон, не внимателен был, исправил. Но результат тот-же. И странно, почему-то окно без слова "Настройки"... Единственное что могу предложить, это скачать оригинальный гаджет с http://weathercenter.narod2.ru но он почти не работает. Может тогда окно нормально отобразиться.

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 22:56 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
Но результат тот-же

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

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 23:00 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
глобальная ли переменная или нет

Это мне сложно сказать. Скорее всего глобальная, там потом ID города берётся в другую функцию. В любом случае всё полностью я дал, можно перепроверить. Попробую сейчас ещё раз не спеша проверить. Но там после нажатия кнопки "Найти" выводится весь список городов.
 
Добавлено:
Тупо скопировал код что выше, результат тот-же, никакой.

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 23:10 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
результат тот-же, никакой.

Вот как дебаггится
https://www.howtogeek.com/howto/windows-vista/how-to-debug-a-windows-vista-sidebar-gadget-with-visual-studio/
мне ради этого ставить визуалку на виртуалку не хочется. если поставите - покажите где выдает ошибку, потому что кусок выше просто в IE работает.

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 23:20 16-10-2019
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тоесть как я понял нужно Visual Studio поставить. Так она у меня на виртуалке уже стоит. Почитаю статью на досуге. А там видно будет. Сам ещё завтра вечером попробую покопаться в приведённом коде.

Всего записей: 1639 | Зарегистр. 25-02-2008 | Отправлено: 23:34 16-10-2019
Mavrikii

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N

Цитата:
понял нужно Visual Studio поставить.  

подойдет любая среда с дебаггером. по крайней мере будет видно где возникают ошибки.

Всего записей: 9222 | Зарегистр. 20-09-2014 | Отправлено: 23:39 16-10-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » Парсинг данных страницы

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru