31547


現在Common Lispで簡単なWebクローラを作成しています。  
plumpとclssを使ってhtmlをパースするところまではできたのですが、要素内で指定されている属性値の取得方法がわかりません。

例えば以下のようなhtmlがあった時に、

[code]

    <a href="hoge.html" title="fuga">リンク</a>
    
[/code]

`href`で指定されている"hoge.html"と、`title`で指定されている"fuga"を取得したい場合、どのように書けばいいのでしょうか。


CC BY-SA 3.0
2016-12-30T07:53:43.733
31544
2016-12-30T15:51:48.793
20059
question
common-lisp
plumpとclssで要素内の属性値を取得したい


`clss:select`でも色々できるとは思いますが、`plump:attribule`で抜き出すことが可能なようです。

  * [PLUMP-DOM:ATTRIBUTE](http://shinmera.github.io/plump/#PLUMP-DOM:ATTRIBUTE)

### 利用例:

[code]

    (let* ((dat (plump:parse "<a href=\"hoge.html\" title=\"hoge\">リンク</a><a href=\"fuga.html\">リンク</a>" ))
           (a-tags (clss:select "a" dat)))
      (loop :for a :across a-tags
            :for href  := (plump:attribute a "href")
            :for title := (plump:attribute a "title")
            :do (format T
                        "~&title=~A href=~A~%"
                        (or title "<none>")
                        (or href "<none>")
                        )))
    ;>> title=hoge href=hoge.html
    ;>> title=<none> href=fuga.html
    ;=> nil 
    
[/code]

属性をまとめて全部取得ならば、`plump:attributes`が使えるようです。

[code]

    (ql:quickload :alexandria)
    
    (let* ((dat (plump:parse "<a href=\"hoge.html\" title=\"hoge\">リンク</a><a href=\"fuga.html\">リンク</a>" ))
           (a-tags (clss:select "a" dat)))
      (loop :for a :across a-tags
            :count a :into cnt
            :do (format T
                        "~&~D:~S~%"
                        cnt
                        (alexandria:hash-table-alist (plump:attributes a))
                        )))
    ;>> 1:(("href" . "hoge.html") ("title" . "hoge"))
    ;>> 2:(("href" . "fuga.html"))
    
[/code]


CC BY-SA 3.0
2016-12-30T15:51:48.793
31547
2016-12-30T15:51:48.793
3510
31544
answer