Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   парсинг тегов, как userjs (https://javascript.ru/forum/misc/17202-parsing-tegov-kak-userjs.html)

xhugo 10.05.2011 18:28

парсинг тегов, как userjs
 
хочу спарсить теги, например <title> , срабатывает у всех сайтов.
Но мне надо именно у вконтакте.ру.
var regex = /<title>(.+?)<\/title>/i;
var allhtml = document.getElementsByTagName("html");
var arr = regex.exec(allhtml[0].innerHTML);

alert(arr[1]);

в чем проблема?

melky 10.05.2011 18:40

в велосипеде
для вывода или назначения надо использовать document.title

alert( document.title )

xhugo 10.05.2011 20:21

дело в том, что я буду парсить ни только тайтл.
ну и все равно на вконтакте не сработал

subzey 10.05.2011 21:24

Не используйте регулярки для разбора (X)HTML!

Есть и другие чудесные способы. ДОМовские: getElementsByTagName, getElementsByClassName, getElementsByЧтоУгодно; CSS-селекторы: querySelector, querySelectorAll; XPath, мощнейший инструмент для траверса.

Только умоляю, никогда не разбирайте HTML-представление содержимого DOM-элемента регулярками в поиске «нужного тега»!

Aetae 11.05.2011 01:07

Хехе, я помнится по молодости поднимал вопрос парсинга ~1мег произвольно оформленного(в т.ч. и лицами далёкими от веба) при помощи html текста с приведением выходного результата к единому виду.(удаление недопустимых тегов и атрибутов и аккуратное форматирование)

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

xhugo 11.05.2011 12:48

subzey, какой именно сработает то?
пробовал несколько, ни один не сработал

melky 11.05.2011 17:57

ну, getElementsByTagName, например

document.getElementsByTagName( 'title' )[0].innerText


всмысле, document.title не сработал?

subzey 11.05.2011 19:38

Aetae,
смотря насколько по молодости. Сейчас можно даже на PHP :)
<?php
header("Content-Type: text/plain; charset=utf-8");

/* Тут наш грязненький код */
$str = <<<EOD
<p mso:crap="enabled" mso:foo="" mso:bar><img src="foo.gif" alt="" mso:shit="enabled">Всем при<strong></strong>вет!</p><br />
<p mso:crap="enabled" mso:foo="" mso:bar> Я&nbsp;&mdash; <u><i>очень</u></i> <strong>грязный</strong> кусок кода!
EOD
;

/* Ошибок будет много. Они нам особо не нужны */
libxml_use_internal_errors(true);

/* Создаем "грязный" документ */
$in_document = new DOMDocument();
/* Флаг: продолжаем парсинг в любом случае */
$in_document->recover = true;
/* Загружаем в "грязный" документ данные */
$in_document->loadHTML('<?xml encoding="utf-8" ?><body>' . $str . '</body>');


/* DOM - это только модель. Имплементаций ее достаточно много. Создаем одну такую. */
$dom = new DomImplementation();
/* К ней создаем доктайп. Старый добрый XHTML 1.0 Strict */
$doctype = $dom->createDocumentType("html", "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd");
/* Наконец, создаем "чистый" документ из имплементации с доктайпом */
$document = $dom->createDocument("http://www.w3.org/1999/xhtml", "html", $doctype);
/* Устанавливаем кодировку явным образом */
$document->encoding = "utf-8";

/* Импортируем из "грязного" документа body */
/* Вот тут, кстати, имеет значение тот самый ownerDocument из соседней темы */
$document->body = $document->documentElement->appendChild($document->importNode($in_document->getElementsByTagName("body")->item(0), true));

/* Создаем объект XPath для "чистого" документа */
$xpath = new DOMXpath($document);

/* Начинаем чистить: */
/* Убираем аттрибуты, начинающиеся с mso: */
foreach ($xpath->query('//attribute::*[starts-with(name(), "mso:")]') as $attr) $attr->parentNode->removeAttributeNode($attr);
/* Убираем все пустые элементы, которые не img, br или hr */
foreach ($xpath->query('//*[not(local-name() = "img" or local-name() = "br" or local-name() = "hr" or local-name() = "link")][not(./node())]') as $element) $element->parentNode->removeChild($element);
/* Убираем все br, которые лежат непосредственно в body */
foreach ($xpath->query('/*/body/br') as $element) $element->parentNode->removeChild($element);
/* . . . ну и так далее, до полного просветления */

/* Вывод с отступами */
$document->formatOutput = true;

/* Выводим */
echo $document->saveXML();

/***
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <p><img src="foo.gif" alt="" />Всем привет!</p>
    <p> Я — <u><i>очень</i></u> <strong>грязный</strong> кусок кода!</p>
  </body>
</html>
**/
?>


Часовой пояс GMT +3, время: 02:58.