#lang scheme ;; ;; A trivial scheme library for interacting with the Bing search engine ;; and getting back Bing results. ;; ;; This library works because Bing is kind enough to offer a ;; parameter: format=xml -- when invoked this way, any bing search ;; can be viewed as an XML document. ;; (require net/url net/uri-codec xml) (provide (struct-out doc)) (define-struct doc (title description url) #:prefab) (define (search query #:offset [offset 0]) (let* ([url (string->url (format "http://www.bing.com/search?~a" (alist->form-urlencoded `((q . ,query) (format . "xml") (first . ,(number->string offset))))))] [page (xml->xexpr (document-element (read-xml (get-pure-port url))))] [hit-list (car (filter-map (match-lambda [(cons 'documentset stuff) stuff] [_ #f]) page))]) (filter-map (match-lambda [(list-no-order (list 'title _ title) (list 'desc _ description) (list 'url _ url) _ ...) (make-doc title description url)] [_ #f]) hit-list))) (provide/contract [search (->* (string?) (#:offset exact-integer?) (listof doc?))])