Вход

Просмотр полной версии : Получить данные из html страницы.


Артист
02.10.2016, 16:44
Я получаю страницу через XMLHttpRequest

Это отрывок из неё, т.е. строка, которую мне нужно получить:
<font class="playersonline">
<span class="txtdet">
<b>
Сейчас в игре 5,822 игрока.
</b>
</span>
</font>

Я всё это делаю поиском, копированием, удалением, с кучей переменных...
В общем мне этот способ не очень нравится:
function authorized()
{
var xhr = new XMLHttpRequest() // Создать объект
xhr.withCredentials = true // Передать куки и параметры авторизации от клиента
xhr.onreadystatechange = function() // Назначить обработчик запроса
{
if(xhr.readyState == 4) // Запрос завершен и ответ готов
{
if(xhr.status == 200) // Успешный запрос
{
var html = xhr.responseText // Получить страницу в тексте

if(html.indexOf('LOGIN_redirect value') != -1) // Если есть форма авторизации
{
var s = html.indexOf('Сейчас в игре ') + 14 // Найти начало
var e = html.indexOf(' игрок') // Найти конец
var n = html.substring(s, e) // Скопировать значение
var num = parseInt(n.replace(/,/g, ""), 10) // Удалить запятую из цифр и перевести из текста в число
var str = 'Сейчас в игре ' + n + ' игрок' // Формирование новой строки

// Правильное окончание начало
var v = num % 100

if(v > 10 && v < 20) str += 'ов.'
else
{
v = num % 10
if(v == 1) str += '.'
else if(v > 1 && v < 5) str += 'ка.'
else str += 'ов.'
}
// Правильное окончание конец

localStorage['player_online'] = str // Записать всю строку в память
}
}
}
}
xhr.open('GET', 'http://www.site.ru/home.php', true) // Конфигурация запроса
xhr.send() // Отправить запрос
}

Есть же какие - то функции специальные чтобы просто получить значение в тегах?

Артист
02.10.2016, 17:08
Что - нибудь типа:

document.querySelector('font[class="playersonline"]')

Только document я так понял означает текущую страницу?

А так можно?
xhr.querySelector('font[class="playersonline"]')

И как потом пропустить это: <span class="txtdet"> и <b> ?

.innerHTML - получить то что в тегах.

Вот так будет работать, или это чушь?
xhr.querySelector('font[class="playersonline"]').querySelector('b').innerHTML
Или так:
xhr.querySelector('font[class="playersonline"]').getElementsByTagName('b').innerHTML

Aetae
02.10.2016, 17:20
Страницы в интернете - просто текст, пока браузер не превратит их в сложную структуру DOM.
XHR как раз и получает этот текст. Вы можете преобразовать вручную (https://developer.mozilla.org/ru/docs/Web/API/DOMParser) его в целиком в DOM, но в вашем случае это бессмысленная трата времени и вычислительных ресурсов: поиск строк стократ быстрее. Это имеет смысл только если вам нужно вытаскивать множество сложноструктурированных данных.

Артист
02.10.2016, 17:52
Спасибо ))
Т.е. лучше так оставить?

Aetae
02.10.2016, 17:57
Т.е. лучше так оставить?
Если нужна только эта строчка или ещё парочка других, то да.
Разве что микрооптимизировать, var e = html.indexOf(' игрок') -> var e = html.indexOf(' игрок', s) //поиск с предыдущей позиции

Артист
02.10.2016, 18:24
Спасибо )

Додумался как проще сделать:
location.href = "authorized.html"

var s = html.indexOf('Сейчас в игре ')
var e = html.indexOf(' игрок', s) + 7

if(html[e] == '.') e += 1 // игрока.
else if(html[e + 1] == '.') e += 2 // игроков.

localStorage['player_online'] = html.substring(s, e)

Aetae
04.10.2016, 05:46
Это не будет работать.
После location.href = "authorized.html" будет переход на другую страницу и весь последующий код исполнен не будет, т.к. останется на предыдущей.

warren buffet
04.10.2016, 16:40
По-моему не останется. Предыдущая страница разве не умирает? )

Aetae
04.10.2016, 16:54
По-моему не останется. Предыдущая страница разве не умирает? )
Одно другому не мешает. Останется и умрёт вместе с ней. Как верный самурай.)