Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как распарсить html (https://javascript.ru/forum/offtopic/60087-kak-rasparsit-html.html)

cyber 10.12.2015 15:50

Как распарсить html
 
Например есть(естественно структура будет на много сложнее)
var xml = "<test> <tag>  <t>\n</t>  </tag> </test>";

я знаю например номер символа, например xml[10] и мне нужно найти его родительский тэг, как это правильно сделать? Потому что пустить через регуляки мне кажется плохой идеей или я ошибаюсь?
В заголовке опечатка там должен быть xml (но суть особо не меняется)

kobezzza 10.12.2015 16:41

Взять либу :) А для запросов - xPath

MallSerg 10.12.2015 16:52

jQuery умеет текст парсить

cyber 10.12.2015 16:54

kobezzza, привет КЭП :)
Как узнать в каком я месте нахожусь что бы на уже спарсеном xml найти тот тэг?
Все что у меня есть строка c xml (xml может быть большой) и номер с местом где я нахожусь в этой строке

EmperioAf 10.12.2015 17:04

Цитата:

Сообщение от cyber
Как узнать в каком я месте нахожусь

Цитата:

Сообщение от cyber
и номер с местом где я нахожусь в этой строке

:)

cyber 10.12.2015 17:05

EmperioAf, я имел ввиду, как потом место в строке найти уже в распарсеном xml

MallSerg 10.12.2015 17:26

простым поиском отфильтровывая всё что внутри < .... > число найденых в простом тексте и готовом доме будет равно не считая сидидата и коментариев

cyber 10.12.2015 17:32

MallSerg, валидный атрибут <valid attribute=">"/>, не все так просто

cyber 10.12.2015 17:41

MallSerg, почему то мне кажется плохой идеей пройтись регулярками по xml

MallSerg 10.12.2015 17:55

А ты фильтруй теги ) никто не говорил что все будет просто
В том же jQuery есть готовые регулярки для фильтрации тегов

cyber 10.12.2015 18:53

MallSerg, один из вариантов)
Попробую, звучит быстрее, чем то что я придумал)

cyber 10.12.2015 19:16

Есть интересная идея, например есть xml, берем его обрезаем до того места что нужно и кидаем в DOMParser, а потом берем последний элемент в дереве.

var xml = '<!--?xmlversion="1.0"encoding="UTF-8"?--><breakfast_menu><food><name>BelgianWaffles</name><price>$5.95</price><description >OurfamousBelgianWaffleswithplentyofrealmaplesyrup</description><calories>650</calories></food><food><name>FrenchToast</name><price>$4.50</price><description>Thickslicesmadefromourhomemadesourdoughbread</description><calories>600</calories></food><food><name>HomestyleBreakfast</name><price>$6.95</price><description>Twoeggs,baconorsausage,toast,andourever-popularhashbrowns</description><calories>950</calories></food></breakfast_menu>';


var halfXML = "<breakfast_menu><food><name>BelgianWaffles</name><price>$5.95</price><description >OurfamousBelgianWaffleswithplentyofrealmaplesyrup"; //обзеранный xml
p.parseFromString(halfXML, "application/xml") // потом пройтись по объекту и найти самый последний элемент

Mаxmaxmаximus 11.12.2015 00:41

cyber, не ожидал от тя такого вопроса еси честно))

var xml = "<test> <tag>  <t>\n</t>  </tag> </test>";
document = new DOMParser().parseFromString(xml, "text/xml");


а для селекторов применяешь https://developer.mozilla.org/en-US/..._in_JavaScript

Mаxmaxmаximus 11.12.2015 00:45

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


я прсото уже парсеров написал штук 10 за этот год, щас вот пишу парсер для coffee++

cyber 11.12.2015 00:50

Цитата:

Сообщение от Mаxmaxmаximus
а, стоп, прочитал задачу, так это же легко, просто начинай от этого символа и иди назад считая открывающие теги) в чем трабл то? тебе код написать?

Давай, гляну твое решение)
Просто не все так просто, мне не просто нужно получить элемент, а его родителя, я хотел получить сначала элемент добавить id вкинуть в DOMParser и по id найти его и взять родителя

Mаxmaxmаximus 11.12.2015 01:44

я не совсем понимаю что значит "получить"

Mаxmaxmаximus 11.12.2015 01:45

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

xml = '<test aa="22"> <tag>  <t>\n</t>  </tag> </test>'
		index = 40
		code = xml.slice(0, index)

		tags = []
		regExp = /<(\/)?(\w+)?.*?/img
		code.replace regExp, (match, isClose, name)->
			tags.push {name, isClose: !!isClose}

		console.log tags
		console.log code
		return

Mаxmaxmаximus 11.12.2015 01:47

Ну а так да, самый лучший вариант просто поставить айдишник ему и получить по айди, если тебе надо получить именно в значении УЗНАТЬ КАКОЙ ЭЛЕМЕНТ В ДОКУМЕНТЕ ОПИСАН В СИМВОЛЕ ПО ТАКОМУ ТО ИНДЕКСУ И ПОЛУЧИТЬ ЕГО РОДИТЕЛЯ, то ты назвал самое очевидное решение, тогда почему его не сделаешь просто)?

тут даже парсеры писать не надо, ну вообще можно там рендж применить типа, берешь и выделение делаешь и смотришь что влезло в выделение, document.creageRange() но там гуглить надо про него, я не помню нифига)

cyber 11.12.2015 01:47

Mаxmaxmаximus,
вот что я написал http://jsfiddle.net/c9cws7au/3/

Mаxmaxmаximus 11.12.2015 01:47

тут даже парсеры писать не надо, ну вообще можно там рендж применить типа, берешь и выделение делаешь и смотришь что влезло в выделение, document.creageRange() но там гуглить надо про него, я не помню нифига)

cyber 11.12.2015 01:55

Mаxmaxmаximus, сенк за идею

cyber 11.12.2015 10:36

Mаxmaxmаximus,
чет как то не очень работает http://jsfiddle.net/789692dq/1/

cyber 11.12.2015 12:35

Mаxmaxmаximus, кстати, если хочешь по веселится присоединяйся, еще пару пунктов
по позиции нужно определить:
- позиция находится внутри атрибута
- внутри тела тэга <tag тут >
- внутри текстовой части тэга <tag> тут </tag>
- или так <tag> <t /> внутри этого </tag>
Потому скину что получилось, если есть интересные идеи то слушаю)
Сейчас делаю это с помощью конечного автомата

cyber 11.12.2015 16:02

Как отличить " \" " от ' " '

Mаxmaxmаximus 11.12.2015 16:09

Цитата:

Сообщение от cyber
Как отличить " \" " от ' " '

Перед парсингом пробегайся по всем экранированным символам и заменяй их на специальную строку заменитель типа $_TMP_$, и сохраняй то что заменяешь в массив, а потом, после обработки, заменяй все вхождения $_TMP_$ на данные из массива в соовтетствующем порядке)

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

Mаxmaxmаximus 11.12.2015 16:11

Цитата:

Сообщение от cyber
кстати, если хочешь по веселится присоединяйся, еще пару пунктов

я уже выше написал парсер, парсишь в "токенлист", массив в котором список обьектов {имяТега, закрывающийЛиТег}

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

п.с.ч то нужно анализимровать второй массив который ПОСЛЕ нужного символа идет я не уверен)

cyber 11.12.2015 16:12

Mаxmaxmаximus, сенк)

cyber 11.12.2015 16:13

Mаxmaxmаximus,
Цитата:

Сообщение от cyber
Сейчас делаю это с помощью конечного автомата

по таком принципу как работает польшая часть парсеров

Mаxmaxmаximus 11.12.2015 16:13

парси теги, учитывая чт они могут быть незакрытыми

парси просто, выискивай скобочки <слово и не обязательно закрывающий тег, или вообще просто треугольные скобочки выискивай

Mаxmaxmаximus 11.12.2015 16:15

Цитата:

Сообщение от cyber
по таком принципу как работает польшая часть парсеров

Ну у меня например ThreeBuilder работает по другому, так типа как регулярные выражения рекурсивные, тока ты каждый элемент опсиываешь яваскрипт функцией и он сам парсит внутри себя, и сам решает когда закончился его код и передает управление дальше. в общем годная тема, потом покажу.

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

cyber 11.12.2015 16:21

Mаxmaxmаximus, проблема в том что мне еще нужно проанализировать и не валидный xml )

cyber 11.12.2015 16:27

Просто то что я написал это верхушка айсберга)
Такое чувство что они хотят что бы я с обычно редактора xml сделал IDE в браузере.
Ребята обкурились походу)

Mаxmaxmаximus 11.12.2015 16:30

Лол стоп, если так стоит задача тогда ты определенно должен построить xml древо нормальное по тегам, и все такое. И чтобы древо имело метод "гет елемнет bay index"

у элементов будет типа innerXML и outerXML
и ты такой к главному элементу пишешь

root.getElementByCharIndex(12)

и он анализирует свой outerXML ну и выдает элемнет

то есть напиши банально парсер XML в древо и все. в чем трабл?

а по скольку ты пишешь свой парсер ты можешь всякие ошибки в коде сразу детектить

задача даже облегчается

cyber 11.12.2015 16:33

Mаxmaxmаximus, я уже написал уже, то что нужно, сейчас буду тестить.
Выложить не могу к сожеленью..

kobezzza 11.12.2015 16:33

Цитата:

Сообщение от cyber (Сообщение 399598)
Как отличить " \" " от ' " '

https://github.com/kobezzza/Escaper

Может пригодиться, писал под свои нужды.

cyber 11.12.2015 16:35

kobezzza,спасибо, у тебя либы для запуска шатлов случайно нет?)

kobezzza 11.12.2015 16:40

Цитата:

Сообщение от cyber (Сообщение 399612)
kobezzza,спасибо, у тебя либы для запуска шатлов случайно нет?)

В скрытых репозитариях ;)

cyber 11.12.2015 16:43

Цитата:

Сообщение от kobezzza
В скрытых репозитариях

Я всегда подозревал:lol:

Mаxmaxmаximus 11.12.2015 17:01

kobezzza, а у меня комментарий это такой токен)) и я их регуляркой паршу, строка тоже токин, число тоже. это сильно ускоряет парсинг.

kobezzza 11.12.2015 17:31

Цитата:

Сообщение от Mаxmaxmаximus (Сообщение 399618)
kobezzza, а у меня комментарий это такой токен)) и я их регуляркой паршу, строка тоже токин, число тоже. это сильно ускоряет парсинг.

Ну у тебя парсер языка, а тут просто утилитка для экранирования.


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