powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / html parser на CommonLisp
3 сообщений из 3, страница 1 из 1
html parser на CommonLisp
    #36175232
AlexGru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция
Код: plaintext
1.
(study:hp (study:file-string "C:/home/myproject/index.html"))

Которая возвращает список
Код: plaintext
1.
(((:A :CLASS "main_class" :HREF "www.mail.ru" :ID "123456") "link_text_xxx"))

из исходного html
Код: plaintext
1.
<a class="main_class" href="www.mail.ru" id="123456">link_text_xxx</a>

Есть такой блок кода, 2 функции, одна рекурсивная, другая выводит элементы найденного списка, у которого колова есть :A.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
(defun parse-a(a-list)
  (dolist (buff a-list)
    (print buff)
  )
)

(defun dump-cont2(cont)
 (print ".")
 (if (eq cont '())
   (return-from dump-cont2) 
   (if (atom (car cont))
        (if (equal :A (car cont))
            (parse-a (cdr cont))
            (dump-cont2 (cdr cont))
        )
      (dump-cont2 (cdr cont))
   )
 )
)

Вызываю так
Код: plaintext
1.
(study:dump-cont2 (study:hp (study:file-string "C:/home/myproject/index.html")))

Выдаёт
Код: plaintext
1.
2.
3.
"." 
"." 
NIL

Если вызвать так
Код: plaintext
1.
 (study:dump-cont2 '(:A :CLASS hello))

То покажет
Код: plaintext
1.
2.
3.
4.
"." 
:CLASS 
HELLO 
NIL

Скажите в чём мой косяк?

Я хочу в функции parse-a выводить элементы списков гипер-ссылок, наёденых в рекурсивной функции.
...
Рейтинг: 0 / 0
html parser на CommonLisp
    #36175941
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСкажите в чём мой косяк?

Косяков у тебя много, но если не вдаваться в подробности, напиши так, хотя - бы, например:

Код: plaintext
1.
2.
3.
4.
5.
6.
(defun dump-cont2(cont)
  (if (eq cont nil)
      nil
      (if (eq (car cont) :A)
          (parse-a (cdr cont))
          (dump-cont2 (car cont)))))

и будет тебе счастье:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CL-USER> (dump-cont2 '(((:A :CLASS "main_class" :HREF "www.mail.ru" :ID "123456") "link_text_xxx")))

:CLASS 
"main_class" 
:HREF 
"www.mail.ru" 
:ID 
"123456" 
NIL

Всех фирмачей прошу простить за такой быдлокод - несколько месяцев не брал в руки лисп.
...
Рейтинг: 0 / 0
html parser на CommonLisp
    #36175943
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че - то прогнал. Так будет работать только для одного элемента.
Так для любого количества:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(defun dump-cont2(cont)
  (if 
   (or
    (atom cont)
    (eq cont nil))
   nil
   (if (eq (car cont) :A)
       (parse-a (cdr cont))
       (progn
         (dump-cont2 (cdr cont))
         (dump-cont2 (car cont))))))


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CL-USER> (dump-cont2 
'(((:A :CLASS "main_class" :HREF "www.mail.ru" :ID "123456") "link_text_xxx")((:B :CLASS "main_class" :HREF "www.mail.ru" :ID "123456") "link_text_xxx")((:A :CLASS "foo" :HREF "www.sql.ru" :ID "678543") "link_text_xxx")((:A :CLASS "main_class" :HREF "www.mail.ru" :ID "123456") "link_text_xxx")))

:CLASS 
"main_class" 
:HREF 
"www.mail.ru" 
:ID 
"123456" 
:CLASS 
"foo" 
:HREF 
"www.sql.ru" 
:ID 
"678543" 
:CLASS 
"main_class" 
:HREF 
"www.mail.ru" 
:ID 
"123456" 
NIL
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / html parser на CommonLisp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]