Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38

Проблемный парсер сайта

22.08.2011, 13:03. Показов 5863. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пмогите плизз, давно уже ломаю голову, хотел написать парсер сайта, чтобы выводил все, что находится между тэгами <table></table>я так понимаю необходимо использовать регулярные выражения, но у меня не получается...помогите.....ниже приведена самая функция, по которой происходит извлечение данных
Python
1
2
3
4
 f = urllib.request.urlopen("http://zd1.alt.mirsudrf.ru/modules.php?name=info_pages&rid=11").read()
    #print(f.info())
    r1=re.compile((r'<table>(.*?)</table>',  re.DOTALL).findall(f))
    print(f)
выдается ошибка
AttributeError: 'tuple' object has no attribute 'findall'
как быть и что делать????
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2011, 13:03
Ответы с готовыми решениями:

Парсер картинок с сайта
Добрый день. Хочу написать парсер картинок с сайта (любого), но не знаю с чего начать., так как в python куча библиотек : не пойму...

Парсер сайта и ссылок с сайта
Добрый день. Подскажите, как реализовать парсер сайта, с которого парсятся все URL и в свою очередь, с них парсятся еще URL?(содержимое...

Парсер сайта
Подскажите как при помощи xpath выдернуть текстовое значение title вот кусок сайта для примера. Сейчас xpath выглядит вот так:...

26
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
22.08.2011, 14:08
Все же правильно так:
Python
1
r1=re.compile(r'<table>(.*?)</table>', re.DOTALL).findall(f)
1
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
22.08.2011, 17:04
А в чем смысл использования функции compile? почему не
Python
1
r1=re.findall(r'<table>(.*?)</table>',f, re.DOTALL)
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.08.2011, 18:42
Цитата Сообщение от pyuser Посмотреть сообщение
А в чем смысл использования функции compile
В данном случае - никакого смысла нет
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
22.08.2011, 18:48
Цитата Сообщение от Nameless One Посмотреть сообщение
В данном случае - никакого смысла нет
Или все же какой-то тайный смысл есть?
0
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
22.08.2011, 19:21
Смысл есть, если это же выражение потом используется повторно.
Я лишь хотел показать, что там скобки лишние
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.08.2011, 19:25
Цитата Сообщение от kill_s Посмотреть сообщение
я так понимаю необходимо использовать регулярные выражения
Можно пользовать lxml (и не изобретать велосипеды):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> html = '''<html><head><title>Test page</title></head><body><b>text1</b><b>text2</b></body></html>'''
>>> import lxml.html
>>> import lxml.etree
>>> doc = lxml.html.document_fromstring(html)
>>> print(lxml.etree.tostring(doc, pretty_print=True).decode('utf-8'))
<html>
  <head>
    <title>Test page</title>
  </head>
  <body>
    <b>text1</b>
    <b>text2</b>
  </body>
</html>
 
>>> for bold_tag in doc.getiterator(tag='b'):
...     if bold_tag.text:
...             print(bold_tag.text)
... 
text1
text2
>>>
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.08.2011, 19:28
Цитата Сообщение от pyuser Посмотреть сообщение
Или все же какой-то тайный смысл есть?
Тайный смысл есть, если один шаблон регулярного выражения должен использоваться несколько раз. Тогда его можно скомпилировать один раз, и использовать уже скомпилированный шаблон вместо того, чтобы компилировать его каждый раз.
0
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
23.08.2011, 08:42  [ТС]
Python
1
2
f = urllib.request.urlopen("url").read()
     r1=re.compile(r'<table>(.*?)</table>',re.DOTALL).findall(f)
теперь выдается вот такая вот ошибка :
TypeError: can't use a string pattern on a bytes-like object
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.08.2011, 11:10
Python
1
2
f = urllib.request.urlopen(url)
pagestr = f.read().decode('utf-8')
1
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 38
23.08.2011, 13:32  [ТС]
и все таки, подскажите как сделать, чтобы отобразилось, все что находится между двумя тэгами <body></body> используя библиотеку urllib и рег выражения?.....
Python
1
2
3
4
 f = urllib.request.urlopen("url")
    pagestr=f.read().decode('cp1251')
    r1=re.compile(r'<tbody>(.*?)</tbody>',re.DOTALL).findall(pagestr)
    print(r1)
на этот код, он выдает только []....что я делаю не так?подскажите,помогите люди добрые...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.08.2011, 02:12
следи за отступами, так как они определяют блоки (как { } в C)
для работы с тегами html используй html

Python
1
2
3
4
5
6
7
8
9
import urllib.request
import re
 
url = 'http://www.yandex.ru'
tag = 'table'
f = urllib.request.urlopen(url)
pagestr = f.read().decode('utf-8')
tagstr = re.findall('<' + tag + '>?.*</' + tag + '>', pagestr)
print(tagstr)
0
95 / 1 / 1
Регистрация: 01.08.2011
Сообщений: 35
24.08.2011, 18:18
Цитата Сообщение от accept Посмотреть сообщение
Python
1
tagstr = re.findall('<' + tag + '>?.*</' + tag + '>', pagestr)
А что обозначает
Code
1
>?.*
Тут получается, что символ > опционален, а дальше будет захвачено все до последенго тега </tag>, т.к. нет вопроса после .*, который делает данный паттерн нежадным.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.08.2011, 02:29
Цитата Сообщение от bestol
Тут получается, что символ > опционален
тег может содержать атрибуты

Цитата Сообщение от bestol
а дальше будет захвачено все до последенго тега </tag>
там берётся первая таблица, в которой есть вложенные таблицы
0
95 / 1 / 1
Регистрация: 01.08.2011
Сообщений: 35
25.08.2011, 02:44
accept, а если таблицы будут не вложенные, а будут идти перемешанными с текстом? Ведь тогда и все эти таблицы и текст между ними захватятся.

Я бы сделал как-нибудь так:
Code
1
('< *' + tag + '[^/>]*>(.*?)</ *' + tag + ' *>', pagestr)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.08.2011, 02:50
Цитата Сообщение от bestol
accept, а если таблицы будут не вложенные, а будут идти перемешанными с текстом? Ведь тогда и все эти таблицы и текст между ними захватятся.
ты как не напиши, тут всегда будет неправильно
если напишешь для невложенных, будет неправильно для вложенных
если напишешь для вложенных, будет неправильно для невложенных

Цитата Сообщение от bestol
Я бы сделал как-нибудь так:
там какие-то пробелы рассматриваются (а там только пробелы могут быть ?)
нужно через html делать
0
95 / 1 / 1
Регистрация: 01.08.2011
Сообщений: 35
25.08.2011, 03:05
Цитата Сообщение от accept Посмотреть сообщение
нужно через html делать
Да!
на stackoverflow обсуждалось, что regexp-ы совершенно не предназначены дла распарсивания таких вот вложенных структур (в данном случае <table> в <table>)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.08.2011, 03:05
Цитата Сообщение от accept
там берётся первая таблица, в которой есть вложенные таблицы
там берётся первая единственная таблица, в которую вложены таблицы
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.08.2011, 03:07
Цитата Сообщение от bestol
на stackoverflow обсуждалось, что regexp-ы совершенно не предназначены дла распарсивания таких вот вложенных структур
одни regexp'ы не подойдут, надо делать рекурсивный анализатор
0
95 / 1 / 1
Регистрация: 01.08.2011
Сообщений: 35
25.08.2011, 03:08
Цитата Сообщение от accept Посмотреть сообщение
а там только пробелы могут быть ?
Qt почему-то пробелы добавляет в некоторые тэги. Во всяком случае мне приходилось пробелы обрабатывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2011, 03:08
Помогаю со студенческими работами здесь

Парсер сайта
Здравствуйте, нужна помощь с парсером. Нужно спарсить https://bittrex.com/home/markets, допустим BITCOIN MARKETS всю таблицу(кроме двух...

Парсер сайта с Авторизацией
Здравствуйте. Пишу парсер и не понимаю что такое &quot;bfp: '83ed3ff8ef095a99cacb741910ce402d'&quot; в форме авторизации, для каждого браузера он...

Парсер закрытого сайта
Нужна помощь с кодом! # coding: utf-8 import requests from bs4 import BeautifulSoup from urllib.request import urlopen from...

Написать парсер для сайта
Здравствуйте. Начну с того, что изучаю пайтон около полтора месяца, успел прочитать Лутца (&quot;Изучаем пайтон&quot;), решить почти все...

Парсер сайта криптовалют на Питоне
Всем привет! Села за задание по учебной практике, суть которой написать парсер сайта криптовалют на языке Python с использованием библиотек...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru