LINUX.ORG.RU

HTML to S-Expression


0

1

А есть ли готовый парсер, перегоняющий html в лисповый список. Желательно с поддержкой некорректного html. И желательно для clojure, а не cl||scheme (хотя это и не критично, если исходники открыты, то можно и портировать).

★★★★

closure-html, см. раздел документации LHTML model. Некорректный html понимает. Это для CL.

slav ★★
()
Ответ на: комментарий от slav

Ok, спасибо, буду смотреть реально ли ее портировать за более-менее вменяемое время.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от paranonymous

я недавно сталкивался с подобным - и мне это надо было чтобы анализировать и выдирать термы из html. А s-exp т.к. лисп умеет их обрабатывать и легче привести магамеда к горе, чем гору к магамеду)

pseudo-cat ★★★
()
Ответ на: комментарий от pseudo-cat

> А s-exp т.к. лисп умеет их обрабатывать

Тем не менее, XPath позволяет делать это значительно проще. Т.е. обычно перегонять html в s-выражения это от лукавого.

archimag ★★★
()
Ответ на: комментарий от paranonymous

Самый главный вопрос - зачем?

Для дальнейшего анализа документа и манипуляций с его структурой.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от archimag

Тем не менее, XPath позволяет делать это значительно проще. Т.е. обычно перегонять html в s-выражения это от лукавого.

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

Nagwal ★★★★
() автор топика
Ответ на: комментарий от Legioner

> Паттерн матчинг удобнее XPath-а

Какой у вас опыт в этой области?

и вообще удобнее всё писать на одном языке, а не на десятке.


XPath это DSL. Не надо путать мягкое с кислым.

archimag ★★★
()
Ответ на: комментарий от Nagwal

> Поэтому проблема раз: перегнать html (возможно корявый) в xml

Это не проблема, обычно, ибо нормальные библиотеки для работы с xml обычно имеют невалидирующий парсер html, который это dom-дерево и делает.

проблема 2: потом все-равно манипулировать напрямую полученным

dom-деревом.



Не понял, в чём суть проблемы? Но, вообще, XPath запросы могу не только узлы возвращать.

http://archimag-dev.blogspot.com/2010/11/blog-post.html - вот я недавно вытаскивал инфу из html, правда на CL.

archimag ★★★
()
Ответ на: комментарий от pseudo-cat

> он преобразовывает html в xhtml перед запросами?

Думаю, что ты не понял, что сказал )

Нет, просто невалидирующий html-парсер тоже строит DOM-дерево.

archimag ★★★
()
Ответ на: комментарий от archimag

Немного подробнее про XPath. Не подходит он потому что (я могу и ошибаться, с ним последний раз дело имел года 4 назад, всего не помню):

1 - Я не знаю _вообще_ ничего про структуру документа. Максимум что мне известно, это то, что есть корневой тэг <body> и все, что от него начинается - темный лес.

2 - Мне надо манипулировать дальнейшей структурой документа, например после анализа элемента удалить его, или кого-то из его потомков, или слить несколько потомков с добавлением дополнительных аттрибутов. Как мне в данном случае поможет XPath?

Nagwal ★★★★
() автор топика
Ответ на: комментарий от Nagwal

XPath запросы могу быть нечёткими, это довольно гибкий язык запросов. Можно найти, например, все узлы, потоки которых имеют аттрибут X и т.п. С помощью запросов находятся нужные узлы, которые потом можно обрабатывать через стандартный DOM.

archimag ★★★
()
Ответ на: комментарий от Nagwal

> я могу и ошибаться, с ним последний раз дело имел года 4 назад,

всего не помню


Если надо обрабатывать xml/html, то вообще стоит освежить и.или углубить знания по XPath, поскольку это наиболее прямой и часто также наиболее простой способ. Т.е. что бы выбирать что-то другое надо сначала понять, действительно ли не подходит XPath. Плюс, для всяких трансформаций документов часто очень хорошо подходит XSLT - значительно удобней, чем s-выражения перемалывать.

archimag ★★★
()
Ответ на: комментарий от Nagwal

Спорить с archimag смысла нет - он тупой и упертый баран с php'шным складом мышления. Советую не тратить время. Для clojure, вероятно, можно использовать жабовские библиотеки. Тут вот уже посоветовали closure-html портировать - это тоже можно конечно, но это сложно.

anonymous
()
Ответ на: комментарий от anonymous

Целью данного топика в том числе является выяснение того, как (и можно-ли вообще) с помощью лиспа (clojure) решить красиво мои конкретные задачки, которые по идее должны хорошо укладываться в его идеологию (обработка древовидных структур данных). А если брать жабские библиотеки, так я проще на самой жабе и напишу, благо прототип на java+jsoap уже есть.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от Nagwal

> как (и можно-ли вообще) с помощью лиспа (clojure) решить красиво

мои конкретные задачки


Использование лиспа не отменяет и не заменяет собой технологии, такие как DOM и т.п.

archimag ★★★
()
Ответ на: комментарий от anonymous

> он тупой и упертый баран с php'шным складом мышления

зато чуть ли единственный на ЛОР, кто умеет использовать CL не только для онанирования в бложиках

aho
()
Ответ на: комментарий от archimag

Может у вас есть описания ваших xpath:функций? Чтобы не молоть это

<body> 
<div id="doc3" class="yui-t5"> 
  	<div id="hd"> 
        <div id="loginGreating" class="head"> 
             
TEST> (with-parse-html (page "www.linux.org.ru/forum/development/")
	(find-list page "/html/body")) 
(#<LIBXML2.TREE:NODE {C5F5109}>)
TEST> (with-parse-html (page "www.linux.org.ru/forum/development/")
	(find-list page "/html/body/div")) 
NIL

как надо?

pseudo-cat ★★★
()
Ответ на: комментарий от pseudo-cat

> Может у вас есть описания ваших xpath:функций?

Да они же простые: find-boolean, find-string, find-number, find-single-node, find-list, кажется всё понятно. Некоторые примеры кода есть здесь: http://cl-libxml2.googlecode.com/svn/doc/examples.html

> Чтобы не молоть это

То молоть не надо, там всё равно без чтения исходников хрен что поймёшь )

> как надо?

С этим кодом какая-то засада, но не на стороне libxml2, а на стороне ЛОРа - видимо он не хочет отдавать контент «первому встречному» (может роботов не любит):

CL-USER> (html:with-parse-html (page "http://www.linux.org.ru/forum/development/")
           (html:serialize-html page *standard-output*))
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>http://www.linux.org.ru/forum/development/</p></body></html>
archimag ★★★
()
Ответ на: комментарий от archimag

С этим кодом какая-то засада, но не на стороне libxml2, а на стороне ЛОРа

тогда вопросов нет, спасибо, а то в xpath всё интуитивно понятно было, пока не попробывал потестить на ЛОРе - вот и подумал, что я что-то не так делаю)

pseudo-cat ★★★
()
Ответ на: комментарий от dave

Можно конечно, но напрягает доп. нагрузка на память и gc за счет лишнего промежуточного дерева. А просто использовать clojure вместо java для работы с jsoup обьектами мне как-то не видится необходимым.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от Nagwal

> А просто использовать clojure вместо java для работы с jsoup

обьектами мне как-то не видится необходимым


Почему? Подозреваю, что вы не совсем того ожидаете от clojure. Вы хотите увидеть какой-то весьма реальный профит, достигнутый за счёт каких-либо «супер-свойств», на специально подобранной (путь и типовой) задаче. Мне же представляется, что профит, должен быть почти на любых задачах, просто в силу иных возможностей по организации кода. Т.е. лисп должен быть более выгоден и применительно к самому обыкновенному коду, коду, который вам не составит труда написать и на java.

archimag ★★★
()
Ответ на: комментарий от aho

Да не умеет он его использовать.
Макросы не использует, а код его - как на PHP(и он еще и гордится этим).

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

Советую посмотреть побольше open-source проектов на CL.

anonymous
()
Ответ на: комментарий от archimag
TEST> (test "http://www.stihi.ru")
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>http://www.stihi.ru</p></body></html>
160
TEST> (test "http://www.gtn.ru")
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>http://www.gtn.ru</p></body></html>
158
TEST> (test "http://www.google.ru")
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>http://www.google.ru</p></body></html>
161
TEST> (test "http://www.google.com")
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>http://www.google.com</p></body></html>
162

не, всё же что-то не так) Как задавать параметры запросов?

pseudo-cat ★★★
()
Ответ на: комментарий от archimag

что ты меня озадачил

извини)

Пошёл разбираться

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

pseudo-cat ★★★
()
Ответ на: комментарий от archimag

А!!!!!!!!!!! Прошу прощения, у меня температура третий день, так что не сразу сообразил((

Что бы распарсить URL надо передавать объект puri:uri, а не строку! Например, #U"http://www.stihi.ru", #U"http://www.linux.org.ru/forum/development/" и т.п.

archimag ★★★
()
Ответ на: комментарий от pseudo-cat

> логично как-то задавать параметры запроса - get, post, cookie

как миниум


cl-libxml2 это обёртка над libmlx2. В libxml2 таких возможностей нет. И не должно быть. Просто уметь загружать xml по ссылке парсер должен уметь, но только это.

archimag ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.