Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.68 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "golang.org/x/net/html"
  5. "net/http"
  6. "log"
  7. "html/template"
  8. )
  9.  
  10. func getAttr(node *html.Node, key string) string {
  11. for _, attr := range node.Attr {
  12. if attr.Key == key {
  13. return attr.Val
  14. }
  15. }
  16. return ""
  17. }
  18.  
  19. func isElem(node *html.Node, tag string) bool {
  20. return node != nil && node.Type == html.ElementNode && node.Data == tag
  21. }
  22.  
  23. func isDiv(node *html.Node, class string) bool {
  24. return isElem(node, "div") && getAttr(node, "class") == class
  25. }
  26.  
  27. func isSection(node *html.Node, class string) bool {
  28. return isElem(node, "section") && getAttr(node, "class") == class
  29. }
  30.  
  31. type Item struct {
  32. Ref, Time, Title string
  33. }
  34.  
  35. func downloadNews(w http.ResponseWriter) []Item {
  36. println("sending request to lenta.ru")
  37. if response, err := http.Get("http://lenta.ru"); err != nil {
  38. println("request to lenta.ru failed", "error", err)
  39. } else {
  40. defer response.Body.Close()
  41. status := response.StatusCode
  42. println("got response from lenta.ru", "status", status)
  43. if status == http.StatusOK {
  44. if doc, err := html.Parse(response.Body); err != nil {
  45. println("invalid HTML from lenta.ru", "error", err)
  46. } else {
  47. println("HTML from lenta.ru parsed successfully")
  48. t, _ := template.ParseFiles("go.html")
  49. var Items []Item
  50. Items = search(w, doc, Items)
  51. //println(len(Items))
  52. data := struct {
  53. Items []Item //создаю айтемы
  54. }{
  55. Items: Items, //кладу в data айтемы
  56. }
  57. t.Execute(w, data) //в html файл отправляет data
  58. return Items
  59. }
  60. }
  61. }
  62. return nil
  63. }
  64.  
  65. func search(w http.ResponseWriter, node *html.Node, items []Item) []Item {
  66. if isSection(node, "b-layout js-layout b-layout_main") {
  67. for one := node.FirstChild; one != nil; one = one.NextSibling { // g-layout
  68. for two := one.FirstChild; two != nil; two = two.NextSibling { //row
  69. for three := two.FirstChild; three != nil; three = three.NextSibling { //span8 js-main__content OR span4 b-sidebar-stickycolumn js-main__sidebars
  70. for four := three.FirstChild; four != nil; four = four.NextSibling { //row b-top7-for-main js-top-seven OR b-sidebar-stickycolumn__top js-main__sidebar-top
  71.  
  72. for five := four.FirstChild; five != nil; five = five.NextSibling { //span4
  73.  
  74. if isDiv(five, "span4") {
  75. for item_firstItem := five.FirstChild; item_firstItem != nil; item_firstItem = item_firstItem.NextSibling {
  76. if isDiv(item_firstItem, "item") || isDiv(item_firstItem, "first-item") {
  77. if resItem := readItem(item_firstItem); resItem.Time != "nil" {
  78. items = append(items, resItem)
  79. println("")
  80. println(resItem.Time)
  81. println(resItem.Title)
  82. println(resItem.Ref)
  83. }
  84. }
  85. }
  86. }
  87.  
  88. for six := five.FirstChild; six != nil; six = six.NextSibling { // b-yellow-box__wrap
  89. if getAttr(six, "class") == "b-yellow-box__wrap" {
  90. for item_firstItem := six.FirstChild; item_firstItem != nil; item_firstItem = item_firstItem.NextSibling {
  91. if isDiv(item_firstItem, "item") || isDiv(item_firstItem, "first-item") {
  92. if resItem := readItem(item_firstItem); resItem.Time != "nil" {
  93. items = append(items, resItem)
  94. println("")
  95. println(resItem.Time)
  96. println(resItem.Title)
  97. println(resItem.Ref)
  98. }
  99. }
  100. }
  101. }
  102. }
  103.  
  104. }
  105. }
  106. }
  107. }
  108. }
  109. }
  110. for recurs := node.FirstChild; recurs != nil; recurs = recurs.NextSibling {
  111. if items := search(w, recurs, items); items != nil {
  112. return items
  113. }
  114. }
  115. return items
  116. }
  117.  
  118. func readItem(item *html.Node) Item {
  119. var myItem Item
  120. for itemChild := item.FirstChild; itemChild != nil; itemChild = itemChild.NextSibling {
  121. if isElem(itemChild, "a") {
  122. myItem.Ref = "Ref: " + getAttr(itemChild, "href")
  123. for itemChildChild := itemChild.FirstChild; itemChildChild != nil; itemChildChild = itemChildChild.NextSibling {
  124. if len(getAttr(itemChildChild, "datetime")) != 0 {
  125. myItem.Time = "Time: " + getAttr(itemChildChild, "datetime")
  126. }
  127. title := itemChildChild.Data
  128. if len(title) >= 6 {
  129. myItem.Title = "Title: " + title
  130. if len(myItem.Time) == 0 {
  131. myItem.Time = "Main News"
  132. }
  133. return myItem
  134. }
  135. }
  136. }
  137. }
  138. myItem.Time = "nil"
  139. return myItem
  140. }
  141.  
  142. func HomeRouterHandler(w http.ResponseWriter, r *http.Request) {
  143. downloadNews(w)
  144. }
  145.  
  146. func main() {
  147. http.HandleFunc("/", HomeRouterHandler) // установим роутер
  148. err := http.ListenAndServe(":12675", nil) // задаем слушать порт
  149. if err != nil {
  150. log.Fatal("ListenAndServe: ", err)
  151. }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement