Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2011 04:19:54

anufrikanec
От:
Зарегистрирован: 2011-04-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

Возможно вопрос покажется глупым, но все же:

Есть задача, вытащить из HTML все ссылки стоящие между регулярными выражениями, но ни как не могу понять как это сделать.
Написал такой код:

>>> import urllib, urllib2
>>> url = 'http://all.auto.ru/list/?category_id=15&section_id=1&subscribe_id=&filter_id=&submit=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8&mark_id=0&year%5B1%5D=&year%5B2%5D=&color_id=&price_usd%5B1%5D=&price_usd%5B2%5D=&currency_key=RUR&body_key=&run%5B1%5D=&run%5B2%5D=&engine_key=0&engine_volume%5B1%5D=&engine_volume%5B2%5D=&drive_key=&engine_power%5B1%5D=&engine_power%5B2%5D=&transmission_key=0&used_key=&wheel_key=&custom_key=&available_key=&change_key=&owner_pts=&stime=0&country_id=1&has_photo=0&region%5B%5D=89&region_id=89&sort_by=2&city_id=&output_format=1&client_id=0&extras%5B1%5D=0&extras%5B2%5D=0&extras%5B3%5D=0&extras%5B4%5D=0&extras%5B5%5D=0&extras%5B6%5D=0&extras%5B7%5D=&extras%5B8%5D=0&extras%5B9%5D=0&extras%5B10%5D=0&extras%5B11%5D=0&extras%5B12%5D=&extras%5B13%5D=0&extras%5B14%5D=0&extras%5B15%5D=0&extras%5B16%5D=0&extras%5B17%5D=0&extras%5B18%5D=&extras%5B19%5D=&extras%5B20%5D=&extras%5B21%5D=&extras%5B22%5D=&extras%5B23%5D=0&extras%5B24%5D=0&extras%5B25%5D=&extras%5B26%5D=&extras%5B27%5D=0&extras%5B28%5D=0&extras%5B29%5D=&_p=1'
>>> headers = {'User-Agent':'Mozilla/5.0 (compatible; MSIE 6.1; WindowsNT)'}
>>> req = urllib2.Request(url,None, headers)
>>> z = urllib2.urlopen(req).read()
Подскажите пожалуйста, как вытащить и сохранить ссылки стоящие между:
<td align=left style=width:30%><a href=“
и
” class=“offer-list”>

Спасибо.



Офлайн

#2 Апрель 18, 2011 18:17:20

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

Написанный код закачивает страницу с нета. К парсингу он никакого отношения не имеет.
Вот пример использования регулярных выражений.

>>> import re
>>> q=re.compile(r'<(.*?)>')
>>> s='qwe<1>qwe<2>werwer<3>'
>>> q.findall(s)
['1', '2', '3']
А вообще нужно почитать доки. И про регулярные выражения тоже http://www.regular-expressions.info/quickstart.html. Тема парсинга HTML обсуждалась многократно, воспользуйтесь поиском по форуму. Там много полезных советов и ссылок.



Офлайн

#3 Апрель 18, 2011 19:27:11

anufrikanec
От:
Зарегистрирован: 2011-04-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

Ни где не смог найти ничего про составление запросов, чтоб вытащить часть информации расположенной между заранее заданными фразами, в ходе трех дневных мучений и попыток переделоть что-то имеющееся под себя получился такой вот “уродец”:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import re
import time
from urllib import *

class Http_Request:
def getURL(self,url):
# Загрузка страницы
return str(urlopen(url).read())

class YaBot(Http_Request):
def get_ya_page(self, request, page, region = 1):
# Создание поискового запроса
page = page # страницы Яндекса начинаются с 0
url = 'http://all.auto.ru/list/?category_id=15&section_id=1&subscribe_id=&filter_id=&submit=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8&mark_id=0&year%5B1%5D=&year%5B2%5D=&color_id=&price_usd%5B1%5D=&price_usd%5B2%5D=&currency_key=RUR&body_key=&run%5B1%5D=&run%5B2%5D=&engine_key=0&engine_volume%5B1%5D=&engine_volume%5B2%5D=&drive_key=&engine_power%5B1%5D=&engine_power%5B2%5D=&transmission_key=0&used_key=&wheel_key=&custom_key=&available_key=&change_key=&owner_pts=&stime=0&country_id=1&has_photo=0&region%5B%5D=89&region_id=89&sort_by=2&city_id=&output_format=1&client_id=0&extras%5B1%5D=0&extras%5B2%5D=0&extras%5B3%5D=0&extras%5B4%5D=0&extras%5B5%5D=0&extras%5B6%5D=0&extras%5B7%5D=&extras%5B8%5D=0&extras%5B9%5D=0&extras%5B10%5D=0&extras%5B11%5D=0&extras%5B12%5D=&extras%5B13%5D=0&extras%5B14%5D=0&extras%5B15%5D=0&extras%5B16%5D=0&extras%5B17%5D=0&extras%5B18%5D=&extras%5B19%5D=&extras%5B20%5D=&extras%5B21%5D=&extras%5B22%5D=&extras%5B23%5D=0&extras%5B24%5D=0&extras%5B25%5D=&extras%5B26%5D=&extras%5B27%5D=0&extras%5B28%5D=0&extras%5B29%5D=&_p=' + \
str(page)

# Возвращаем страницу поиска
return self.getURL(url)

def site_place(self,
site, # сайт, который ищем в поиске
request, # поисковый запрос для анализа
to_page, # кол-во страниц поиска для анализа
per_page = 50, #кол-во результатов на странице
region = 1): # регион поиска, подробнее тут:
# http://bit.ly/cKeksq
for page in range(1, to_page+1):
#Запрос очередной страницы поиска
data = self.get_ya_page(request, page, region)
# Подготовка регулярных выражений для поиска на
# странице результатов Яндекса
# Номера позиций
position_regex = re.compile(r'<b class="b-serp-item__number">([0-9]+)</b>')
# Адреса страниц (пока не используется)
search_url_regex = re.compile(r'<td align=left style=width:30%><a href="http://cars.auto.ru/cars/used/sale ?/([^"/]+)')
# Адреса сайтов
url_regex = re.compile('<td align=left style=width:30%><a href="http://cars.auto.ru/cars/used/sale ?/([^"/]+\.[a-z]{2,4})')
# Каптча
captcha_regex = re.compile('<div class="b-captcha">')

# Поиск на странице результатов Яндекса
positions = position_regex.findall(data)
# search_urls = search_url_regex.findall(data)
urls = url_regex.findall(data)
captcha = captcha_regex.findall(data)

print urls


if captcha:
return -2

for position in positions[:per_page]:
if urls[int(position)-((page-1)*per_page)-1].upper() == site.upper():
return position

time.sleep(3) # Антикаптча

return -1

def main():
ya = YaBot()
site = 'unlim-net.ru' # с www или без имеет значение
request = 'безлимитка'
region = 2 # Москва

site_position = ya.site_place(site, request, 1, region = region) #сколько страниц запросит

if site_position == -1:
print 'sayt ne nayden'
elif site_position == -2:
print 'CAPTCHA'
else:
print 'poziciya: '+str(site_position)

if __name__ == "__main__":
main()
С помощью него, я смог получить нужную информацию со страницы, но вот привести его в божеский вид (это переделаный парсер яндекса), так чтоб он продолжал при этом работать, так и не смог. И полученную информацию в файл писать, он так-же категорически отказывается.

Огромная просьба ко всем, кому не лень, помочь отредактировать этот код.



Офлайн

#4 Апрель 18, 2011 20:22:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

Причесывать трудно. Но “чтоб вытащить часть информации расположенной между заранее заданными фразами”
Это можно сделать так

some="....."
res=re.search(r"frase1(.+)frase2",some,re.S).group(1)



Отредактировано (Апрель 18, 2011 20:22:35)

Офлайн

#5 Апрель 18, 2011 20:49:38

anufrikanec
От:
Зарегистрирован: 2011-04-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

Переделал так:

f=open ('/avtoru/mpage.txt', 'w')
import urllib, urllib2, re
url = 'http://all.auto.ru/list/?category_id=15&section_id=1&subscribe_id=&filter_id=&submit=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8&mark_id=0&year%5B1%5D=&year%5B2%5D=&color_id=&price_usd%5B1%5D=&price_usd%5B2%5D=&currency_key=RUR&body_key=&run%5B1%5D=&run%5B2%5D=&engine_key=0&engine_volume%5B1%5D=&engine_volume%5B2%5D=&drive_key=&engine_power%5B1%5D=&engine_power%5B2%5D=&transmission_key=0&used_key=&wheel_key=&custom_key=&available_key=&change_key=&owner_pts=&stime=0&country_id=1&has_photo=0&region%5B%5D=89&region_id=89&sort_by=2&city_id=&output_format=1&client_id=0&extras%5B1%5D=0&extras%5B2%5D=0&extras%5B3%5D=0&extras%5B4%5D=0&extras%5B5%5D=0&extras%5B6%5D=0&extras%5B7%5D=&extras%5B8%5D=0&extras%5B9%5D=0&extras%5B10%5D=0&extras%5B11%5D=0&extras%5B12%5D=&extras%5B13%5D=0&extras%5B14%5D=0&extras%5B15%5D=0&extras%5B16%5D=0&extras%5B17%5D=0&extras%5B18%5D=&extras%5B19%5D=&extras%5B20%5D=&extras%5B21%5D=&extras%5B22%5D=&extras%5B23%5D=0&extras%5B24%5D=0&extras%5B25%5D=&extras%5B26%5D=&extras%5B27%5D=0&extras%5B28%5D=0&extras%5B29%5D=&_p=1'
headers = {'User-Agent':'Mozilla/5.0 (compatible; MSIE 6.1; WindowsNT)'}
req = urllib2.Request(url,None, headers)
some = urllib2.urlopen(req).read()
frase1='<td align=left style=width:30%><a href="'
frase2='" class="offer-list">'
res=re.search(r"frase1(.+)frase2",some,re.S)
print (res)
Интерпритатор ушел в тяжелый накдаун, из за чего может быть?



Офлайн

#6 Апрель 18, 2011 21:02:26

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

Нужно разбивать сложную задачу на несколько простых :
1) скачать страницу с нета
2) распарсить - отфильтровать нужную информацию
3) записать результат в файл
в данном посте, насколько я понял, речь идет о втором пункте.
для этого можно использовать регулярные выражения или библиотеку для парсинга HTML страниц, например, BeautifulSoup. Если фильтрация сложная, то и то и другое. В самом простом варианте можно использовать примеры, описанные раньше.
Только в предыдущем примере лучше ставить знак вопроса после плюса, в противном случае регексп подтянет все между первым вхождением frase1 и последним frase2.

some="....."
res=re.search(r"frase1(.+?)frase2",some,re.S).group(1)



Отредактировано (Апрель 18, 2011 21:05:15)

Офлайн

#7 Апрель 18, 2011 21:04:30

anufrikanec
От:
Зарегистрирован: 2011-04-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

я так и попытался вначале сделать, но выдает ошибку:

Traceback (most recent call last):
File “C:/avtoru/test2.py”, line 10, in <module>
res=re.search(r“frase1(.+)frase2”,some,re.S).group(1)
AttributeError: ‘NoneType’ object has no attribute ‘group’



Офлайн

#8 Апрель 18, 2011 21:13:09

Yurietc
От:
Зарегистрирован: 2007-07-18
Сообщения: 112
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

Это потому, что регексп ничего не находит, и re.search(r“frase1(.+)frase2”,some,re.S) возвращает None, а потом вызывается метод group, которого у объекта None просто нет.
А по поводу предыдущего кода - не нужно открывать файл перед скачиванием и парсингом. Нужно делать последовательно - скачал - распарсил - записал.
Но основная ошибка - ты объявляешь переменные frase1 и frase2, но нигде их не используешь. А в регексп подставляешь строки frase1 и frase2.



Отредактировано (Апрель 18, 2011 21:18:57)

Офлайн

#9 Апрель 18, 2011 21:16:55

anufrikanec
От:
Зарегистрирован: 2011-04-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

А из за чего может ничего не находить, подскажи плз.

Вот кусок страницы в котором содержится искомая часть текста:

</tr><tr class=“alter”>
<td align=left style=width:30%><a href="http://cars.auto.ru/cars/used/sale/9914624-26ee.html“ class=”offer-list">

Страницу он точно получает, т.к. может ее вывести.
Из за чего он может не находить ту ссылку которую я хочу от него получить. (в данном случае: http://cars.auto.ru/cars/used/sale/9914624-26ee.html)



Офлайн

#10 Апрель 18, 2011 21:17:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

вытаскивание ссылок из HTML

У меня не уходит. Правда ваша строка долго качается всетаки 150 килобайт.
python 2.6
вашим желаниям больше соответствует:

res=re.search(frase1+r"(.+)"+frase2,some,re.S)
print (res.group(1))



Отредактировано (Апрель 18, 2011 21:18:57)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version