Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "golang.org/x/net/html"
- "net/http"
- "log"
- "html/template"
- )
- func getAttr(node *html.Node, key string) string {
- for _, attr := range node.Attr {
- if attr.Key == key {
- return attr.Val
- }
- }
- return ""
- }
- func isElem(node *html.Node, tag string) bool {
- return node != nil && node.Type == html.ElementNode && node.Data == tag
- }
- func isDiv(node *html.Node, class string) bool {
- return isElem(node, "div") && getAttr(node, "class") == class
- }
- func isSection(node *html.Node, class string) bool {
- return isElem(node, "section") && getAttr(node, "class") == class
- }
- type Item struct {
- Ref, Time, Title string
- }
- func downloadNews(w http.ResponseWriter) []Item {
- println("sending request to lenta.ru")
- if response, err := http.Get("http://lenta.ru"); err != nil {
- println("request to lenta.ru failed", "error", err)
- } else {
- defer response.Body.Close()
- status := response.StatusCode
- println("got response from lenta.ru", "status", status)
- if status == http.StatusOK {
- if doc, err := html.Parse(response.Body); err != nil {
- println("invalid HTML from lenta.ru", "error", err)
- } else {
- println("HTML from lenta.ru parsed successfully")
- t, _ := template.ParseFiles("go.html")
- var Items []Item
- Items = search(w, doc, Items)
- //println(len(Items))
- data := struct {
- Items []Item //создаю айтемы
- }{
- Items: Items, //кладу в data айтемы
- }
- t.Execute(w, data) //в html файл отправляет data
- return Items
- }
- }
- }
- return nil
- }
- func search(w http.ResponseWriter, node *html.Node, items []Item) []Item {
- if isSection(node, "b-layout js-layout b-layout_main") {
- for one := node.FirstChild; one != nil; one = one.NextSibling { // g-layout
- for two := one.FirstChild; two != nil; two = two.NextSibling { //row
- for three := two.FirstChild; three != nil; three = three.NextSibling { //span8 js-main__content OR span4 b-sidebar-stickycolumn js-main__sidebars
- 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
- for five := four.FirstChild; five != nil; five = five.NextSibling { //span4
- if isDiv(five, "span4") {
- for item_firstItem := five.FirstChild; item_firstItem != nil; item_firstItem = item_firstItem.NextSibling {
- if isDiv(item_firstItem, "item") || isDiv(item_firstItem, "first-item") {
- if resItem := readItem(item_firstItem); resItem.Time != "nil" {
- items = append(items, resItem)
- println("")
- println(resItem.Time)
- println(resItem.Title)
- println(resItem.Ref)
- }
- }
- }
- }
- for six := five.FirstChild; six != nil; six = six.NextSibling { // b-yellow-box__wrap
- if getAttr(six, "class") == "b-yellow-box__wrap" {
- for item_firstItem := six.FirstChild; item_firstItem != nil; item_firstItem = item_firstItem.NextSibling {
- if isDiv(item_firstItem, "item") || isDiv(item_firstItem, "first-item") {
- if resItem := readItem(item_firstItem); resItem.Time != "nil" {
- items = append(items, resItem)
- println("")
- println(resItem.Time)
- println(resItem.Title)
- println(resItem.Ref)
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- for recurs := node.FirstChild; recurs != nil; recurs = recurs.NextSibling {
- if items := search(w, recurs, items); items != nil {
- return items
- }
- }
- return items
- }
- func readItem(item *html.Node) Item {
- var myItem Item
- for itemChild := item.FirstChild; itemChild != nil; itemChild = itemChild.NextSibling {
- if isElem(itemChild, "a") {
- myItem.Ref = "Ref: " + getAttr(itemChild, "href")
- for itemChildChild := itemChild.FirstChild; itemChildChild != nil; itemChildChild = itemChildChild.NextSibling {
- if len(getAttr(itemChildChild, "datetime")) != 0 {
- myItem.Time = "Time: " + getAttr(itemChildChild, "datetime")
- }
- title := itemChildChild.Data
- if len(title) >= 6 {
- myItem.Title = "Title: " + title
- if len(myItem.Time) == 0 {
- myItem.Time = "Main News"
- }
- return myItem
- }
- }
- }
- }
- myItem.Time = "nil"
- return myItem
- }
- func HomeRouterHandler(w http.ResponseWriter, r *http.Request) {
- downloadNews(w)
- }
- func main() {
- http.HandleFunc("/", HomeRouterHandler) // установим роутер
- err := http.ListenAndServe(":12675", nil) // задаем слушать порт
- if err != nil {
- log.Fatal("ListenAndServe: ", err)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement