Mam kilka adresów URL. Chcę analizować określoną liczbę, aby pamiętać o zmiennej jak:

if number ==15 : 
    category ='tree'
elif number ==20:
    category ='flower'
elif number ==3:
    category ='bird'

URL są formularza:

http://www.test.tw/in/15   
http://www.test.tw/in/15?page=2  
http://www.test.tw/in/15/#/?page=3
http://www.test.tw/in/20/#/?page=2
http://www.test.tw/in/3/?page=5

Do tej pory metoda używam:

urls = (
    ('http://www.test.tw/in/15','tree'),    #category =x[1]
    ('http://www.test.tw/in/20','flower'),   
    ('http://www.test.tw/in/3','bird'),   
)

Ale kiedy adres URL ma coś takiego ?page=2 Nie działa.

-2
user2492364 12 sierpień 2014, 17:56

5 odpowiedzi

Najlepsza odpowiedź

Możesz użyć REGEX, aby wyszukać wzorzec, a następnie użyć słownika zamiast łańcucha if-else:

import re

pattern = re.compile(r'/in/(\d+)')
categories = {'15': 'tree', '20': 'flower', '3': 'bird'}

def getcategory(url):
    category = pattern.search(url).group(1)
    return categories[category]

Przykład

urls = ['http://www.test.tw/in/15',
        'http://www.test.tw/in/15?page=2',
        'http://www.test.tw/in/15/#/?page=3',
        'http://www.test.tw/in/20/#/?page=2',
        'http://www.test.tw/in/3/?page=5']

print [(url, getcategory(url)) for url in urls]

Wynik :

[('http://www.test.tw/in/15', 'tree'),
 ('http://www.test.tw/in/15?page=2', 'tree'),
 ('http://www.test.tw/in/15/#/?page=3', 'tree'),
 ('http://www.test.tw/in/20/#/?page=2', 'flower'),
 ('http://www.test.tw/in/3/?page=5', 'bird')]
0
enrico.bacis 12 sierpień 2014, 14:14

Nie musisz używać wyrażenia regularnego.

Użyj urlparse.urlparse (urllib.parse.urlparse w Python 3.x):

>>> import urlparse
>>> urlparse.urlparse('http://www.test.tw/in/15/#/?page=3')
ParseResult(scheme='http', netloc='www.test.tw', path='/in/15/', params='', query='', fragment='/?page=3')
>>> urlparse.urlparse('http://www.test.tw/in/15/#/?page=3').path.rstrip('/').rsplit('/')[-1]
'15'
4
falsetru 12 sierpień 2014, 13:58

Użyj urlparse, jak sugeruje innych i spojrzeć w Regex jako ostatni ośrodek.

(?<=\/)\d+(?=\/|\?|$)

Oto Demo online

Przykładowy kod:

import re
p = re.compile(ur'(?<=\/)\d+(?=\/|\?|$)', re.MULTILINE)
test_str = u"URLs"

re.findall(p, test_str)

enter image description here

0
Braj 12 sierpień 2014, 14:03

Możesz także użyć wyrażenia regularnego, ale wciąż potrzebuje Urlparse. Łącząc te dwa, możesz to zrobić:

import urlparse
import re
my_url = urlparse.urlparse('http://www.test.tw/in/15/#/?page=3')
my_match = re.match(r"/in/(?P<num>\d+)/$", my_url.path)
my_match.group("num")
>> 15

Można jednak zobaczyć, że jest to kruche i zależy, że wszystkie adresy URL wyglądają na "takie same", ale działa dla Django :)

0
Henrik Andersson 12 sierpień 2014, 14:05

Na podejście oparte na regex:

import re
list = ["http://www.test.tw/in/15", "http://www.test.tw/in/15?page=2",
        "http://www.test.tw/in/15/#/?page=3",
        "http://www.test.tw/in/20/#/?page=2", "http://www.test.tw/in/3/?page=5"]
urls = ()
categories = {"tree": [], "flower": [], "bird": []}
for i in list:
    category = int(re.search("(http\:\/\/.+)\/(\d+)", i).group(2))

    if category == 15:
        urls += ((i, "tree"),)
    elif category == 20:
        urls += ((i, "flower"),)
    elif category == 3:
        urls += ((i, "bird"),)

print urls

wyjście

(('http://www.test.tw/in/15', 'tree'), ('http://www.test.tw/in/15?page=2', 'tree'), ('http://www.test.tw/in/15/#/?page=3', 'tree'), ('http://www.test.tw/in/20/#/?page=2', 'flower'), ('http://www.test.tw/in/3/?page=5', 'bird'))
0
kkontagion 12 sierpień 2014, 14:48