Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/39: Рейтинг темы: голосов - 39, средняя оценка - 4.95
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89

Очень нужны дельные советы: парсить сайт

04.07.2013, 21:39. Показов 7929. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит задача вытащить из сайта все закупки, которые были сделаны за период. Я полный новичок в теме, но уже начитанный новичок Прошу подскажите какой тег нужно в брать в функции def handle_starrtag(self, tag,attrs), чтобы вытащить именно закупки с сайта? - по идеи ссылки? - но как именно те, что требуются...-подсказали обращаться через ключи (keys), но что-то расплывчато все очень. И еще дайте совет как верно подключиться к серверу нужной html-странички, прочел про класс from http.client import HTTPConnection и взял только con = HTTPConnection("http://etp.setonline.ru/app/Search/page") - но думаю это несовсем верно. Объясните кто что сможет.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /usr/bin/env python3
 
from http.client import HTTPConnection
from html.parser import HTMLParser
 
con = HTTPConnection("http://etp.setonline.ru/app/Search/page")
 
class ZaParser(HTMLParser)
        keys = {
            'Способ закупки:':'',
            'Дата размещения:':'publishDate',
            'Дата и время окончания подачи заявок:':'endDate'
            }    
  def handle_starrtag(self, tag,attrs):
    if tag == 'A':
            print('See')
  p = ZaParser()
        p.feed(ZaParser.read())
        p.close()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2013, 21:39
Ответы с готовыми решениями:

Очень нужны советы
Добрый день. Знакомый занимается канцелярией и имеет несколько магазинов. Он решил еще открыть и сайт. Создание, наполнение и раскрутку...

Диплом, ОЧЕНЬ нужны советы
Здравствуйте. Сразу к делу, я пишу сейчас диплом на тему "Автоматическая система измерения весо-габаритных характеристик груза в...

Дайте дельные советы по выбору ПК лимит 35т
Вобщем хочу заменить почти полностью ПК от старого остается жесткий сегейт баракуда на 750гб,СД РОМ и корпус гигабайт посейдон 310....

25
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.07.2013, 21:43
модуль html применяется для создания своих парсеров
для парсинга используй сторонний модуль lxml
0
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
04.07.2013, 21:49  [ТС]
по идеи нужно создать свой парсер, поэтому и связался с html
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.07.2013, 22:06
Цитата Сообщение от tymrfik Посмотреть сообщение
по идеи нужно создать свой парсер
не, задание - распарсить страницу, взяв из неё определённые данные
создание своего парсера - это, например, сделать парсер, который будет распознавать теги, переводя их в какие-нибудь другие сущности
то есть где подразумевается какой-то нестандартный разбор html-кода

Добавлено через 52 секунды
Цитата Сообщение от tymrfik Посмотреть сообщение
И еще дайте совет как верно подключиться к серверу нужной html-странички
через urllib.request.urlopen()

Добавлено через 4 минуты
лучше сначала сохранить страницу на диске, и из неё вытаскивать данные
а потом, когда будет готово, сделать часть скрипта, которая будет скачивать страницу
1
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
04.07.2013, 22:08  [ТС]
А если позже нужно будет "Закупки" (которые каким-то для меня пока непонятным образом вытащить из ссылок) занести в базу CouchDB - вот ради этого стоит же писать свой парсер?!
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.07.2013, 22:21
Цитата Сообщение от tymrfik Посмотреть сообщение
вот ради этого стоит же писать свой парсер
не, ты все нужные данные переводишь в простой текст, а потом простой текст заносишь в базу данных
база данных не должна знать, откуда взят текст, а html-страница не должна знать, что эти данные пойдут в базу данных
это называется "минимальное сцепление"
смысл того, чтобы сначала выбирать из страницы на диске, тоже в том, чтобы сделать минимальное сцепление (независимость от сети)

Добавлено через 5 минут
при минимальном сцеплении ты можешь данные из страницы направить не в базу данных, а обратно в сеть на другой сайт, либо не на другой сайт, а в электронную почту, либо не обратно в сеть, а в модуль, который сделает из этого pdf-документ

текст имеет простейшую структуру, поэтому программы, обменивающиеся простым текстом, очень гибки

Добавлено через 1 минуту
wiki. принципы Unix
0
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
05.07.2013, 06:32  [ТС]
а как установить модуль lmxl на python3.3 ? по всякому пробую, не получается. подскажите??
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
05.07.2013, 06:43
Цитата Сообщение от tymrfik Посмотреть сообщение
по всякому пробую, не получается
Как пробуешь?
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.07.2013, 08:37
Цитата Сообщение от tymrfik Посмотреть сообщение
а как установить модуль lmxl на python3.3 ?
скачиваешь исходники
Bash
1
2
python3 setup.py build
sudo python3 setup.py install
есть и пакет
Code
1
2
3
[guest@localhost ~]$ .yum lxml | grep python3
python3-lxml.x86_64 : ElementTree-like Python 3 bindings for libxml2 and libxslt
[guest@localhost ~]$
1
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
09.07.2013, 23:22  [ТС]
Теперь пытаюсь поставить на домашнем компе уже прост осам питон 3.3. С помощью след.:
wget http://python.org/ftp/python/3... .0.tar.bz2
tar jxf ./Python-3.3.0.tar.bz2
cd ./Python-3.3.0
./configure --prefix=/opt/python3.3
make && sudo make install
mkdir ~/bin
ln -s /opt/python3.3/bin/python ~/bin/py
Вроде все проходит, но почему то скомпилировать с помощью строчки: python3 example.py не получается.
А при проверке, выдал след:
root@darkstar:/media/Lu# apt-cache search python | grep -P '^python3\.\d\s'
python3.1 - An interactive high-level object-oriented language (version 3.1)
Как установить то?(
И еще будет вопрос.

Добавлено через 17 минут
(если можете подскажите пожалуйста.)
Получилось так что с lmxl пришлось повременить..И нужен совет по след коду:
Python
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
#! /usr/bin/env python3
 
try:
   from HTMLParser import HTMLParser
   from urllib2 import urlopen
except ImportError:
   from html.parser import HTMLParser
   from urllib.request import urlopen
   import sys
class PrintLinks(HTMLParser):
 
  def handle_starttag(self,tag,attrs):
    if tag=='tr':
     d=dict(attrs)
     if ("id" in d and d["id"].startswith("For_")):
       print(d)
     """"  if (tag == "td"):
                    print("See", attrs)
  #def handle_data(self,data):
     #print (data)
  #def handle_endtag(self,tag):  
p = PrintLinks()
u = urlopen('http://etp.setonline.ru/app/Search/page')
data = u.read()
charset = u.info().get_content_charset() # Python 3.#
 
p.feed(data.decode(charset))
p.close()
На самой странице следующее нужно вытащить :
HTML5
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
 <tr id="For_23">
        
            <td align="center" id="typeColumnCell">
            <img title="Закупка" src="/etp/img/arrow_down.gif" alt="Закупка" id="Any"></img>
        </td> 
        
            <td id="cellRenderer">
        Запрос предложений
    </td> 
        
            <td id="subjectColumnCell">
            <a id="ParametrizedPageLink_4" href="/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvadna9ehbqm2vk">
                <span id="subject.corebofs000080000jvadna9ehbqm2vk">Выполнение работ по промывке и опрессовке системы отопления административного здания ЦАИТС - ОСП ФГУП «Почта России»</span>
            </a>
        </td> 
        
            <td id="cellRenderer_0">
        ЦАИТС - ОСП ФГУП "Почта России"
    </td> 
        
            <td id="cellRenderer_1">
        <div class='right'>70 000.00 руб.</div>
    </td> 
        
            <td id="cellRenderer_2">
        12 июл 2013
    </td> 
        
            <td id="cellRenderer_3">
        22 июл 2013 17:00
    </td> 
        
    </tr><tr id="For_32">
...тут пошла след закупка
Вопрос вот в чем: благодаря функции def handle_starttag(self,tag,attrs): нашли все нужные нам строки, а чтобы сами данные (просто текст - "такая-то закупка") он отображал -нужно же использовать функцию def handle_data(self,data ? - только каким образом: не понимаю как ее связать конкр для уже выбранных тегов из def handle_starttag(self,tag,attrs): Можете подсказать как это реализовывать?
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
10.07.2013, 08:45
Цитата Сообщение от tymrfik Посмотреть сообщение
Теперь пытаюсь поставить на домашнем компе уже прост осам питон 3.3. С помощью след.:
а там разве в пакетах нет ?

Цитата Сообщение от tymrfik Посмотреть сообщение
Code
1
python3.1 - An interactive high-level object-oriented language
какой-то старый дистр

Code
1
2
3
[guest@localhost ~]$ rpm -q python3
python3-3.3.0-1.fc18.x86_64
[guest@localhost ~]$
вообще ставится он
Bash
1
2
3
./configure
make
sudo make install
Цитата Сообщение от tymrfik Посмотреть сообщение
только каким образом: не понимаю как ее связать конкр для уже выбранных тегов из def handle_starttag(self,tag,attrs): Можете подсказать как это реализовывать?
ты когда открывающий тег находишь, выставляешь флажок в объекте, в закрывающем теге снимаешь его
а в теге данных проверяешь его

Цитата Сообщение от tymrfik Посмотреть сообщение
Получилось так что с lmxl пришлось повременить..
там просто это одной строчкой делается обычно

Добавлено через 2 минуты
и для третьего питона пиши код для третьего питона
не надо писать смесь для третьего и второго

Добавлено через 3 часа 56 минут
пример с lxml
Python
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
#!/usr/bin/env python3
 
import lxml.html
 
s = """
<tr id="For_23">
        
            <td align="center" id="typeColumnCell">
            <img title="Закупка" src="/etp/img/arrow_down.gif" alt="Закупка" id="Any"></img>
        </td> 
        
            <td id="cellRenderer">
        Запрос предложений
    </td> 
        
            <td id="subjectColumnCell">
            <a id="ParametrizedPageLink_4" href="/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvadna9ehbqm2vk">
                <span id="subject.corebofs000080000jvadna9ehbqm2vk">Выполнение работ по промывке и опрессовке системы отопления административного здания ЦАИТС - ОСП ФГУП «Почта России»</span>
            </a>
        </td> 
        
            <td id="cellRenderer_0">
        ЦАИТС - ОСП ФГУП "Почта России"
    </td> 
        
            <td id="cellRenderer_1">
        <div class='right'>70 000.00 руб.</div>
    </td> 
        
            <td id="cellRenderer_2">
        12 июл 2013
    </td> 
        
            <td id="cellRenderer_3">
        22 июл 2013 17:00
    </td> 
        
    </tr>
    
<tr id="For_23">
        
            <td align="center" id="typeColumnCell">
            <img title="Закупка" src="/etp/img/arrow_down.gif" alt="Закупка" id="Any"></img>
        </td> 
        
            <td id="cellRenderer">
        Запрос предложений
    </td> 
        
            <td id="subjectColumnCell">
            <a id="ParametrizedPageLink_4" href="/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvadna9ehbqm2vk">
                <span id="subject.corebofs000080000jvadna9ehbqm2vk">Выполнение работ по промывке и опрессовке системы отопления административного здания ЦАИТС - ОСП ФГУП «Почта России»</span>
            </a>
        </td> 
        
            <td id="cellRenderer_0">
        ЦАИТС - ОСП ФГУП "Почта России"
    </td> 
        
            <td id="cellRenderer_1">
        <div class='right'>70 000.00 руб.</div>
    </td> 
        
            <td id="cellRenderer_2">
        12 июл 2013
    </td> 
        
            <td id="cellRenderer_3">
        22 июл 2013 17:00
    </td> 
        
    </tr>
    
"""
 
html = lxml.html.fromstring(s)
for rec in html.xpath('//tr[starts-with(@id, "For_")]'):
    t = (rec[1].text,
         rec[2][0].attrib['href'],
         rec[2][0][0].text,
         rec[3].text,
         rec[4][0].text,
         rec[5].text,
         rec[6].text)
    lst = list(map(str.strip, t))
    print(lst)
Code
1
2
3
4
[guest@localhost zak]$ ./zak.py 
['Запрос предложений', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvadna9ehbqm2vk', 'Выполнение работ по промывке и опрессовке системы отопления административного здания ЦАИТС - ОСП ФГУП «Почта России»', 'ЦАИТС - ОСП ФГУП "Почта России"', '70 000.00 руб.', '12 июл 2013', '22 июл 2013 17:00']
['Запрос предложений', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvadna9ehbqm2vk', 'Выполнение работ по промывке и опрессовке системы отопления административного здания ЦАИТС - ОСП ФГУП «Почта России»', 'ЦАИТС - ОСП ФГУП "Почта России"', '70 000.00 руб.', '12 июл 2013', '22 июл 2013 17:00']
[guest@localhost zak]$
0
7 / 7 / 5
Регистрация: 03.01.2009
Сообщений: 42
10.07.2013, 15:18
Можно ли установить lxml-3.2.1.win32-py3.2 на python 3.3? По идее версии 3.3 и 3.2 совместимы?
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
10.07.2013, 16:25
Цитата Сообщение от yanita Посмотреть сообщение
Можно ли установить lxml-3.2.1.win32-py3.2 на python 3.3?
думаю, да: версия 3.3 уже давно есть, если бы не подходило, то они бы закинули установщик
0
 Аватар для Neketos
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 7
10.07.2013, 22:08
Цитата Сообщение от accept Посмотреть сообщение
не, ты все нужные данные переводишь в простой текст, а потом простой текст заносишь в базу данных
база данных не должна знать, откуда взят текст, а html-страница не должна знать, что эти данные пойдут в базу данных
это называется "минимальное сцепление"
смысл того, чтобы сначала выбирать из страницы на диске, тоже в том, чтобы сделать минимальное сцепление (независимость от сети)

Добавлено через 5 минут
при минимальном сцеплении ты можешь данные из страницы направить не в базу данных, а обратно в сеть на другой сайт, либо не на другой сайт, а в электронную почту, либо не обратно в сеть, а в модуль, который сделает из этого pdf-документ

текст имеет простейшую структуру, поэтому программы, обменивающиеся простым текстом, очень гибки

Добавлено через 1 минуту
wiki. принципы Unix
попробую подключиться к дискуссии. Правильно было сказано про минимальное сцепление. Парсеры используются для получения информации с html. При чем сам парсер работает только с текстом, в данном случае html, и не нужно заботиться о том, откуда данные, и что с ними дальше делать. Получается модульность. Если изменится чтото на сервера сайта, который парсим (путь запроса например), или с сами данные, полученные от парсера, впоследствии придется по-другому обрабатывать, сам парсер останется неизменным (ну или если поменять результат его работы, что мы получаем на выходе, стрку, массив строк, кортежи и т.д. и т.п.).

Сделайте снчала парсер просто для сохраненного файла с того сайта, для которого создаете парсер. Ведь получить html GET-запросом несложно, да и занесение в базу данных тоже после можно реализовать. Главное сам парсер, а для проверки правильности его работы, можно просто выводить на консоль что он спарсил.

Это чем-то может напомнить разработку через тестирование.

что касается html.parser из стандартной библиотеки языка, то он относится к sax-парсерам. Т.е. не строит DOM-дерево из html, а последовательно пробегает по символам строки. Покажу на вашем же примере.
Мы создаем объект этого класса, и переопределяем часть его методов. Когда парсер "пробегается" по документу, он вызывает определенные методы, передавая различные данные в эти методы.

Если вы говорите что вы начитан, то я не буду сильно вдаваться в подробности реализации парсера и структуры html документа.

Метод handle_starrtag(self, tag,attrs) вызывается когда парсер встречает открывающийся тег ("<"), пробегает до завершающей ">"
Вот что получается для строки
HTML5
1
<img title="Закупка" src="/etp/img/arrow_down.gif" alt="Закупка" id="Any">
:
tag это имя самого тега, tag = "img"
а attrs это массив кортежей всех его аттрибутов
Python
1
attrs= [("title","Закупка"),("src","/etp/img/arrow_down.gif"),("alt","Закупка"),("id","Any")]
handle_data(data) вызывается когда мы встречаем какие либо данные (не внутри "<>"):
для строки
HTML5
1
2
3
<td id="cellRenderer">
        Запрос предложений
    </td>
получим data = " Запрос предложений"
пробел я специально оставил, чтобы показать, что если имеются пробелы, то строка передается как есть, вместе со всеми пробелами

handle_endtag(tag) вызывается когда встречаем закрывающийся тег, например из предыдущей строки это бы был тег "</td>"

Это наиболее часто используемые методы, про остальные можно почитать на официальном сайта языка, http://docs.python.org/3/library/html.parser.html
Мы можем в любой момент узнать на какой позиции в тексте сейчас находится парсер, можем сбросить и начать парсинг сначала, и многое другое.

Единственное НО состоит в том, что нам придется запоминать и анализировать, какой тег был открыт, закрыт или какие атрибуты были у данного тега, .... для того, чтобы точно знать, как поступать с данными в тот или иной момент.

Возьмем вашу задачу. Можно увидеть, что у нужных ссылок <a id="ParametrizedPageLink_4" href="/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080 000jvadna9ehbqm2vk"> Общее начало у аттрибута id. Воспользуемся этим и продемонстрируем получение ссылок со страницы.
P.S.: надеюсь это не наказуемо))

Для получения данных
Python
1
2
3
4
5
def getResponseHTML():
    connection = HTTPConnection("etp.setonline.ru")
    connection.request("GET","/app/Search/page")
    response = connection.getresponse().read().decode()
    return response
Сам парсер
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class PrintLinks(HTMLParser):
    href = ""
    ishref = 0
    arrayLinks = []
    def handle_starttag(self,tag,attrs):
        if (tag == "a"):
            for key,value in attrs:
                if (key == "id" and value.startswith("ParametrizedPageLink")):
                    self.ishref = 1
                elif (key == "href"):
                    self.href = value
 
    def handle_endtag(self,tag):
        if (tag == "a"):
            if (self.ishref == 1):
                self.arrayLinks.append(self.href)
                self.ishref = 0
            else:
                self.href = ""
Собственное, сам запуск всего и результат
Python
1
2
3
parser = PrintLinks()
parser.feed(getResponseHTML())
print(parser.arrayLinks)
Python
1
['/app/LotList/page?LotList.filter=Sdeclared', '/app/LotList/page?LotList.filter=Sapproval', '/app/LotList/page?LotList.filter=Scurrent', '/app/LotList/page?LotList.filter=Spaused', '/app/LotList/page?LotList.filter=Sfinished', '/app/SaleLotList/page?SaleLotList.filter=Sdeclared', '/app/SaleLotList/page?SaleLotList.filter=Sapproval', '/app/SaleLotList/page?SaleLotList.filter=Scurrent', '/app/SaleLotList/page?SaleLotList.filter=Spaused', '/app/SaleLotList/page?SaleLotList.filter=Sfinished', '/app/Search/page', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvhs5ae9g136c1s', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvhiap1cbpc1ago', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvbkidvv00j8on4', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvgouq88jcq7opc', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jv8lvqe2vm0kt2o', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvbcen7jtetup2o', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvf9nb4ogsn5i0s', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvf9tr44k5gvams', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvfa395gk3l3vuc', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvfa9kp3320ku5o', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvb9ikmm47s4cqo', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvferb33lmp6khg', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvgpu2i6fhkvq5o', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvi169nehqklei0', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvhs2pjpg1slrbs', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvhr8tg3dnr90mo', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvi2fcf0l5mlkr0', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvi28lu7abs5nuk', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvhvu0ov1kp21fo', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvi0ovalhuo3d70', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvi2149i8s4umug', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvfh5uradqoguu4', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvi1ieeg2nm5ui0', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jva063ko7v8b7lk', '/app/OfferCard/page?OfferCard.offerUUID=Scorebofs000080000jvf4hdkaef4tp5s']
Мы проверяем, какой открывающийся тег, и если это тег "а", то пробегаемся по его атрибутам и проверяем условия, есть ли нужный id, и есть ли href и сохраняем это значение. Далее, при закрывающемся теге "а" проверяем, были ли спарсены данные (ishref ==1) и в случае успешности проверки заносим ссылку в массив.

Вот тривиальная реализация парсера, надеюсь поможет

Добавлено через 7 минут
из результатов видно, что в массив попали разные ссылки, среди них не только на закупки. Для этого следует добавить дополнительные условия, не буду сильно много расписывать как сделать, оставлю вам на самостоятельную работу
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
10.07.2013, 22:26
Цитата Сообщение от Neketos Посмотреть сообщение
Python
1
2
3
4
5
def getResponseHTML():
    connection = HTTPConnection("etp.setonline.ru")
    connection.request("GET","/app/Search/page")
    response = connection.getresponse().read().decode()
    return response
есть urllib.request.urlopen()

Добавлено через 5 минут
Цитата Сообщение от Neketos Посмотреть сообщение
Это чем-то может напомнить разработку через тестирование.
разработка через тестирование основана на принципе разработки сверху вниз
разработка сверху вниз эффективнее разработки снизу вверх, так как интерфейсы получаются с первого раза
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
11.07.2013, 04:42
Цитата Сообщение от yanita Посмотреть сообщение
Можно ли установить lxml-3.2.1.win32-py3.2 на python 3.3
Нет. Этот пакет исключительно для python 3.2. Здесь найдете пакет для Вашей версии python'а.
1
 Аватар для Neketos
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 7
11.07.2013, 07:59
urllib не дает требуемой гибкости. По крайней мере, я не нашел реализации чтобы в пределах одного соединения отправить несколько запросов, а не открывать каждый раз новое соединение для выполнения запроса. Если это возможно, то покажите как
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.07.2013, 09:36
Цитата Сообщение от Neketos Посмотреть сообщение
По крайней мере, я не нашел реализации чтобы в пределах одного соединения отправить несколько запросов
в предложенной функции соединение тоже открывается каждый раз, причём ещё и не закрывается
да и цена этой оптимизации ?
0
 Аватар для Neketos
1 / 1 / 0
Регистрация: 07.07.2013
Сообщений: 7
11.07.2013, 22:56
Цитата Сообщение от accept Посмотреть сообщение
в предложенной функции соединение тоже открывается каждый раз, причём ещё и не закрывается
да и цена этой оптимизации ?
Так ведь и запрос в данном случае отпраляем лишь один. По поводу вашего вопроса, вы знаете что такое сокет, порт?
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.07.2013, 01:06
Цитата Сообщение от Neketos Посмотреть сообщение
Так ведь и запрос в данном случае отпраляем лишь один.
если функцию вызвать два раза, то будет два открытых соединения

Цитата Сообщение от Neketos Посмотреть сообщение
По поводу вашего вопроса, вы знаете что такое сокет, порт?
ты сам-то знаешь ?
ты действительно думаешь, что urlopen() какая-то нерациональная функция ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2013, 01:06
Помогаю со студенческими работами здесь

Оцените сборки, дельные советы - плюсик к в карму
Есть две сборки, над которыми размышляю. Различие в цене минимальное. Любые советы, подводные камни, может что-то избыточно или наоборот,...

Очень нужны ваши советы по программе-справочнике!
Доброго времени суток. Необходимо сделать проект - программу справочник. Выглядеть она должна примерно так: Слева будет список всех...

Сборка ПК (ДНС, 80-120к), очень нужны советы
Всем добрейшего времени суток. В связи с тем, что последний раз я обновлял комп 10 лет назад, то вынужден просить помощи у более...

Очень нужны советы по решение, Кривошип, вращение
Здравствуйте. Подскажите мне, мне нужно решить эту задачу, я а даже не знаю с чего начать. Дайте пожалуйста советы по решению как...

Нужны советы по HTML сайтику ( очень простой - без css js flash).
Друзья, нам на учебе задали сделать свои простенький HTML сайт ( без css, js ,flash). Тупо HTL страницы. Как бы главная и еще 5 разделов....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru