54 lines
1.7 KiB
Nim
54 lines
1.7 KiB
Nim
import httpclient, strutils, htmlparser, xmltree, strtabs
|
|
const
|
|
PageSize = 7
|
|
YahooURLPattern = "https://search.yahoo.com/search?fr=opensearch&b=$$#&pz=$#&p=".format(PageSize)
|
|
type
|
|
SearchResult = ref object
|
|
url, title, content: string
|
|
SearchInterface = ref object
|
|
client: HttpClient
|
|
urlPattern: string
|
|
page: int
|
|
results: array[PageSize+2, SearchResult]
|
|
proc newSearchInterface(question: string): SearchInterface =
|
|
new result
|
|
result.client = newHttpClient()
|
|
# result.client = newHttpClient(proxy = newProxy(
|
|
# "http://localhost:40001")) # only http_proxy supported
|
|
result.urlPattern = YahooURLPattern&question
|
|
proc search(si: SearchInterface) =
|
|
let html = parseHtml(si.client.getContent(si.urlPattern.format(
|
|
si.page*PageSize+1)))
|
|
var
|
|
i: int
|
|
attrs: XmlAttributes
|
|
for d in html.findAll("div"):
|
|
attrs = d.attrs
|
|
if attrs != nil and attrs.getOrDefault("class").startsWith("dd algo algo-sr relsrch"):
|
|
let d_inner = d.child("div")
|
|
for a in d_inner.findAll("a"):
|
|
attrs = a.attrs
|
|
if attrs != nil and attrs.getOrDefault("class") == " ac-algo fz-l ac-21th lh-24":
|
|
si.results[i] = SearchResult(url: attrs["href"], title: a.innerText,
|
|
content: d.findAll("p")[0].innerText)
|
|
i+=1
|
|
break
|
|
while i < len(si.results) and si.results[i] != nil:
|
|
si.results[i] = nil
|
|
i+=1
|
|
proc nextPage(si: SearchInterface) =
|
|
si.page+=1
|
|
si.search()
|
|
|
|
proc echoResult(si: SearchInterface) =
|
|
for res in si.results:
|
|
if res == nil:
|
|
break
|
|
echo(res[])
|
|
|
|
var searchInf = newSearchInterface("weather")
|
|
searchInf.search()
|
|
searchInf.echoResult()
|
|
echo("searching for next page...")
|
|
searchInf.nextPage()
|
|
searchInf.echoResult()
|