Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1

Web grabber. Структура неправильно заполняется

28.06.2018, 14:28. Показов 1535. Ответов 2

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.
Заинтересовался Go, пока, конечно, только на уровне простых вещей типа грабберов.
В принципе тут есть все, чтобы их эффективно писать. Для парсинга html мне, конечно, привычнее использовать что-то имеющее синтаксис Xpath или CSSQuery, поэтому доустановил htmlquery.

Граббер работает, но с обработкой ошибок что-то не то. Структура Task должна в случае ошибок возвращать дефолтные значения, которые я передаю: например, title:"Title not found". Но при Println в консоль в ошибочных тасках выводятся только поле status (404 - потому что страница не найдена) и сам url. Текста ошибки нет (вместо него None) и "Title not found" тоже не выводится.

Task, который обработан ErrorHandler:
Code
1
{404  http://poesy.su/tag/stihi-klassikov/page/110/ None}
Task при нормальном завершении работы: ("Стихи классиков" это title у всех страниц)
Code
1
{200 Стихи классиков http://poesy.su/tag/stihi-klassikov/page/19/ None}
В чем я ошибся?
(Код, само собой, скорей всего не очень идиоматичен в плане Go style - но за неделю изучения иного не напишешь, тем более если основной язык это Python :-) )
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main
 
import (
    "fmt"
    "time"
    "net/http"
    "strings"
    "io/ioutil"
    //"errors"
    "github.com/antchfx/htmlquery"
    
)
 
type Grab struct {
     urlFormat string
     maxPage int
}
 
type Task struct {
     status int
     title string
     url string
     err string
}
 
 
func (grab *Grab) ErrorHandler(
    status int,
    title string,
    url  string,
    err error,
    ) Task {
      
        return Task{
            status:status,
            title:title,
            url:url,
            err:err.Error(),
        }
    }
 
func (grab *Grab) parser(page int) Task {
    // Request the HTML page.
    url := fmt.Sprintf(grab.urlFormat,page)
    resp, err := http.Get(url)
    //doc, err := htmlquery.LoadURL(fmt.Sprintf(grab.urlFormat,page))
    //default_title := "Title not found"
    default_err := "None"
    defer resp.Body.Close() 
    status := resp.StatusCode 
    
    if err != nil {
        return grab.ErrorHandler(status,"Title not found", url, err)
    }    
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return grab.ErrorHandler(status,"Title not found", url, err)
    }
    
    doc, err := htmlquery.Parse(strings.NewReader(string(body)))
    if err != nil {
        return grab.ErrorHandler(status,"Title not found", url, err)
    }
    
    node_title := htmlquery.FindOne(doc, "//title")
    
    title := htmlquery.InnerText(node_title)
    
    return Task{
        status:status,
        title:title,
        url:url,
        err:default_err,
        }
}
 
func (grab *Grab) worker(
    page int, 
    results chan<- Task)  {
    
    results <- grab.parser(page)
}
 
func main() {
    start := time.Now()
    fmt.Printf("START: %s\n",start)
    
    grab := &Grab{
        urlFormat: "http://poesy.su/tag/stihi-klassikov/page/%d/",
        maxPage : 110, 
    }
    
    //jobs := make(chan int, grab.maxPage)
    results := make(chan Task, grab.maxPage)
    defer close(results)
    // создаем воркеров для обработки каждой страницы
    for page := 1; page <= grab.maxPage; page ++ {
        go grab.worker(page, results)
        
    }
 
    // читаем результаты из канала results
    for a := 1; a <= grab.maxPage; a++ {
        fmt.Println(<-results)
    } 
    /* 
    for {
        time.Sleep(50 * time.Millisecond)
        select {
            case res := <-results:
                fmt.Println(res)
            default:
               fmt.Println("The End")
               
        }
    }
    */
    
    fmt.Println("END:",time.Since(start).Seconds())
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.06.2018, 14:28
Ответы с готовыми решениями:

Неправильно заполняется отчет
Приветствую всех! Столкнулся с проблемой фильтрации данных и передачи их в отчет т.е. на форме &quot;фПриказУТ&quot; выбирается Группа...

Неправильно заполняется массив
Заполняю массив значениями 2 4 6 8 10 12 14 16 18, а когда вывожу его, то результат совсем другой. В комментарии показал. Почему так? ...

Не заполняется структура
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;stdio.h&gt; #include&lt;conio.h&gt; //#include &quot;stdafx.h&quot; using namespace std; bool...

2
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
28.06.2018, 16:29
Лучший ответ Сообщение было отмечено Garry Galler как решение

Решение

http.Get возвращает ошибку только при проблемах с получением ответа или при слишком большом количестве редиректов. А 404 — валидный ответ.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.06.2018, 19:11  [ТС]
Цитата Сообщение от NoMasters Посмотреть сообщение
А 404 — валидный ответ
Да, не подумал об этом. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2018, 19:11
Помогаю со студенческими работами здесь

Структура не заполняется данными
Доброе время суток господа,помогите исправить ошибки в коде.При попытке ввода фамилии выдает ошибку. Создать структуру, которая должна...

Массив искомого пути заполняется неправильно
Подскажите, пожалуйста, почему в массиве path для всех i выходит одно и то же значение? Когда дохожу до выполнения 330 строки ...

Неправильно заполняется счёт-фактура на аванс
Доброго времени господа программисты ! Такая проблема в БП 2.0. Есть документ поступление на расчётный счёт. В нём четыре строки с...

Неправильно заполняется поле text в ComboBox
Всем доброго времени суток! Коротко о проблеме, необходимо запросом заполнить айтемсы у комбобокса, написал такой обработчки ...

Почему некорректно заполняется структура?
1-й вариант #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct { uint16_t bfType; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru