Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.52 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "github.com/mgutz/logxi/v1"
  5. "golang.org/x/net/html"
  6. "html/template"
  7. //"fmt" // пакет для форматированного ввода вывода
  8. "net/http" // пакет для поддержки HTTP протокола
  9. // "log"
  10. )
  11. func getChildren(node *html.Node) []*html.Node {
  12. var children []*html.Node
  13. for c := node.FirstChild; c != nil; c = c.NextSibling {
  14. children = append(children, c)
  15. }
  16. return children
  17. }
  18.  
  19. func getAttr(node *html.Node, key string) string {
  20. for _, attr := range node.Attr {
  21. if attr.Key == key {
  22. return attr.Val
  23. }
  24. }
  25. return ""
  26. }
  27.  
  28. func isText(node *html.Node) bool {
  29. return node != nil && node.Type == html.TextNode
  30. }
  31.  
  32. func isElem(node *html.Node, tag string) bool {
  33. return node != nil && node.Type == html.ElementNode && node.Data == tag
  34. }
  35.  
  36. func isDiv(node *html.Node, class string) bool {
  37. return isElem(node, "div") && getAttr(node, "class") == class
  38. }
  39.  
  40. func readItem(item *html.Node) *Item {
  41. if a := item.FirstChild; isElem(a, "a") {
  42. if cs := getChildren(a); len(cs) == 1 && isText(cs[0]){
  43. return &Item{
  44. Ref: getAttr(a, "href"),
  45. Title: cs[0].Data,
  46. }
  47. }
  48. }
  49. return nil
  50. }
  51.  
  52. type Item struct {
  53. Ref, Time, Title string
  54. }
  55.  
  56.  
  57. func downloadNews() []*Item {
  58. log.Info("sending request to lenta.ru")
  59. if response, err := http.Get("http://lenta.ru"); err != nil {
  60. log.Error("request to lenta.ru failed", "error", err)
  61. } else {
  62. defer response.Body.Close()
  63. status := response.StatusCode
  64. log.Info("got response from lenta.ru", "status", status)
  65. if status == http.StatusOK {
  66. if doc, err := html.Parse(response.Body); err != nil {
  67. log.Error("invalid HTML from lenta.ru", "error", err)
  68. } else {
  69. log.Info("HTML from lenta.ru parsed successfully")
  70. //items:=search(doc)
  71. //log.Info("len(items)", "a:", len(items))
  72. /*for i:=0; i<len(items); i++{
  73. log.Info("-- In readItem -->");
  74. log.Info("<a href='a'>", "a:", items[i].Ref)
  75. log.Info("NEWS", "NEWS:", items[i].Title)
  76. log.Info("TIME", "TIME:", items[i].Time)
  77. }*/
  78. return search(doc)
  79. }
  80. }
  81. }
  82. return nil
  83. }
  84.  
  85. func search(node *html.Node) []*Item {
  86. if isDiv(node, "b-yellow-box__wrap"){
  87. var items []*Item
  88. for c := node.FirstChild; c != nil; c = c.NextSibling {
  89. if isDiv(c, "item") {
  90. if item := readItem(c); item != nil {
  91. items = append(items, item)
  92. }
  93. }
  94. }
  95. return items
  96. }
  97. for c := node.FirstChild; c != nil; c = c.NextSibling {
  98. if items := search(c); items != nil {
  99. return items
  100. }
  101. }
  102. return nil
  103. }
  104.  
  105. type TemplateItem struct {
  106. Title string
  107. Items [] *Item
  108. }
  109.  
  110. func HomeRouterHandler(w http.ResponseWriter, r *http.Request) {
  111. r.ParseForm() //анализ аргументов,
  112. var items []*Item;
  113. items = downloadNews()
  114. templItem := TemplateItem{
  115. Title : "НОВОСТИ",
  116. Items : items,
  117. }
  118. tmpl, _ := template.ParseFiles("templ.html")
  119. tmpl.Execute(w, templItem)
  120. //fmt.Fprintf(w, "Hello!") // отправляем данные на клиентскую сторону
  121. }
  122.  
  123. func main() {
  124. http.HandleFunc("/", HomeRouterHandler) // установим роутер
  125. err := http.ListenAndServe(":10060", nil) // задаем слушать порт
  126. if err != nil {
  127. log.Fatal("ListenAndServe: ", err)
  128. }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement