Форум сайта python.su
Возможно вопрос покажется глупым, но все же:
Есть задача, вытащить из HTML все ссылки стоящие между регулярными выражениями, но ни как не могу понять как это сделать.
Написал такой код:
>>> import urllib, urllib2
>>> url = 'http://all.auto.ru/list/?category_id=15§ion_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=¤cy_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®ion%5B%5D=89®ion_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()
Офлайн
Написанный код закачивает страницу с нета. К парсингу он никакого отношения не имеет.
Вот пример использования регулярных выражений.
>>> import re
>>> q=re.compile(r'<(.*?)>')
>>> s='qwe<1>qwe<2>werwer<3>'
>>> q.findall(s)
['1', '2', '3']
Офлайн
Ни где не смог найти ничего про составление запросов, чтоб вытащить часть информации расположенной между заранее заданными фразами, в ходе трех дневных мучений и попыток переделоть что-то имеющееся под себя получился такой вот “уродец”:
#! /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§ion_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=¤cy_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®ion%5B%5D=89®ion_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()
Офлайн
Причесывать трудно. Но “чтоб вытащить часть информации расположенной между заранее заданными фразами”
Это можно сделать так
some="....."
res=re.search(r"frase1(.+)frase2",some,re.S).group(1)
Отредактировано (Апрель 18, 2011 20:22:35)
Офлайн
Переделал так:
f=open ('/avtoru/mpage.txt', 'w')
import urllib, urllib2, re
url = 'http://all.auto.ru/list/?category_id=15§ion_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=¤cy_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®ion%5B%5D=89®ion_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)
Офлайн
Нужно разбивать сложную задачу на несколько простых :
1) скачать страницу с нета
2) распарсить - отфильтровать нужную информацию
3) записать результат в файл
в данном посте, насколько я понял, речь идет о втором пункте.
для этого можно использовать регулярные выражения или библиотеку для парсинга HTML страниц, например, BeautifulSoup. Если фильтрация сложная, то и то и другое. В самом простом варианте можно использовать примеры, описанные раньше.
Только в предыдущем примере лучше ставить знак вопроса после плюса, в противном случае регексп подтянет все между первым вхождением frase1 и последним frase2.
some="....."
res=re.search(r"frase1(.+?)frase2",some,re.S).group(1)
Отредактировано (Апрель 18, 2011 21:05:15)
Офлайн
я так и попытался вначале сделать, но выдает ошибку:
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’
Офлайн
Это потому, что регексп ничего не находит, и re.search(r“frase1(.+)frase2”,some,re.S) возвращает None, а потом вызывается метод group, которого у объекта None просто нет.
А по поводу предыдущего кода - не нужно открывать файл перед скачиванием и парсингом. Нужно делать последовательно - скачал - распарсил - записал.
Но основная ошибка - ты объявляешь переменные frase1 и frase2, но нигде их не используешь. А в регексп подставляешь строки frase1 и frase2.
Отредактировано (Апрель 18, 2011 21:18:57)
Офлайн
А из за чего может ничего не находить, подскажи плз.
Вот кусок страницы в котором содержится искомая часть текста:
</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)
Офлайн
У меня не уходит. Правда ваша строка долго качается всетаки 150 килобайт.
python 2.6
вашим желаниям больше соответствует:
res=re.search(frase1+r"(.+)"+frase2,some,re.S)
print (res.group(1))
Отредактировано (Апрель 18, 2011 21:18:57)
Офлайн