scrapy re.match не работает найти URL-адреса в строке с помощью регулярного выражения

Я пытаюсь просканировать несколько URL в одном домене. Мне нужно указать список URL-адресов в строке. Я хочу искать регулярное выражение в строке и находить URL-адреса. Но re.match () всегда ничего не возвращает. Я тестирую свое регулярное выражение, и оно работает. Это мой код:

# -*- coding: UTF-8 -*-

import scrapy
import codecs 
import re

from scrapy.contrib.spiders import CrawlSpider, Rule

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

from scrapy import Request

from scrapy.selector import HtmlXPathSelector

from hurriyet.items import HurriyetItem

class hurriyet_spider(CrawlSpider):
    name = 'hurriyet'
    allowed_domains = ['hurriyet.com.tr']
    start_urls = ['http://www.hurriyet.com.tr/gundem/']

    rules = (Rule(SgmlLinkExtractor(allow=('\/gundem(\/\S*)?.asp$')),'parse',follow=True),) 

    def parse(self, response):
        image = HurriyetItem()
        text =  response.xpath("//a/@href").extract()
        print text

        urls = ''.join(text)


        page_links = re.match("(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’]))", urls, re.M)

        image['title'] = response.xpath("//h1[@class = 'title selectionShareable'] | //h1[@itemprop = 'name']/text()").extract()
        image['body'] = response.xpath("//div[@class = 'detailSpot']").extract()
        image['body2'] = response.xpath("//div[@class = 'ctx_content'] ").extract()
        print page_links

        return image, text

person Kerim Caner Tümkaya    schedule 30.04.2015    source источник
comment
Используйте 1_. re.match соответствует только началу строки.   -  person Wiktor Stribiżew    schedule 30.04.2015
comment
Я пытаюсь снова не работать re.match () return none re.findall () return []   -  person Kerim Caner Tümkaya    schedule 30.04.2015
comment
Это означает, что ваше регулярное выражение виновато. Помогает ли регулярное выражение из этого сообщения: stackoverflow.com/questions/1141848/regex-to-match-url < / а>? Вы можете проверить еще один: mathiasbynens.be/demo/url-regex.   -  person Wiktor Stribiżew    schedule 30.04.2015


Ответы (1)


Нет необходимости использовать модуль re, у селекторов Scrapy есть встроенная функция фильтрации регулярных выражений:

def parse(self, response):
        ...
        page_links = response.xpath("//a/@href").re('your_regex_expression')
        ...

С учетом сказанного, я предлагаю вам сначала поиграть с этим подходом в оболочке Scrapy, чтобы убедиться, что ваше регулярное выражение действительно работает. Потому что я не ожидал, что люди попытаются отладить регулярное выражение длиной в милю - в основном это язык только для записи :)

person bosnjak    schedule 30.04.2015
comment
Эй, а почему write-only? :) Взгляните на вопрос, на который я только что ответил: stackoverflow.com/questions/29960796/. Регулярные выражения не так уж и нечитабельны. - person Wiktor Stribiżew; 30.04.2015
comment
Это шутка о том, какие они уродливые для чтения, но более плавные при письме. - person bosnjak; 30.04.2015
comment
Вы шутите. Приведенное выше регулярное выражение имеет длину всего половину мили, и такие сайты, как regex101.com, могут превратиться это в красивое абстрактное искусство. - person lcd047; 30.04.2015
comment
@ lcd047: Я не из тех, кто соревнуется в регулярном выражении у кого больше, поэтому я не измерял, это было скорее быстрое приближение: D - person bosnjak; 30.04.2015