2009-08-12 13 views
8

Jestem nowy w Pythonie (nie mam też żadnego szkolenia programistycznego), więc proszę o tym pamiętać, gdy zadaję moje pytanie.Regex Matching Error

Próbuję wyszukać pobraną stronę i znaleźć wszystkie linki przy użyciu określonego wzorca. Zrobiłem to z powodzeniem w innych skryptach, ale otrzymuję błąd, który mówi

raise error, v # invalid expression 

sre_constants.error: multiple repeat

muszę przyznać, że nie wiem, dlaczego, ale znowu, jestem nowy w Pythonie i wyrażeń regularnych. Jednak nawet jeśli nie używam wzorców i używam określonego linku (tylko do przetestowania dopasowania), nie wierzę, że zwracam jakiekolwiek dopasowania (nic nie jest wysyłane do okna podczas drukowania match.group (0). testowałem jest wypowiedziało się poniżej.

pomysłów? to zwykle jest mi łatwiej uczą się przez przykład, ale wszelkie porady można dać mile widziana!

Brock

import urllib2 
from BeautifulSoup import BeautifulSoup 
import re 

url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html" 
page = urllib2.urlopen(url).read() 
soup = BeautifulSoup(page) 

pattern = r'<a href="http://forums.epicgames.com/archive/index.php?t-([0-9]+).html">(.?+)</a> <i>((.?+) replies)' 
#pattern = r'href="http://forums.epicgames.com/archive/index.php?t-622233.html">Gears of War 2: Horde Gameplay</a> <i>(20 replies)' 

for match in re.finditer(pattern, page, re.S): 
    print match(0) 

Odpowiedz

0
import urllib2 
import re 
from BeautifulSoup import BeautifulSoup 

url = "http://forums.epicgames.com/archive/index.php?f-356-p-164.html" 
page = urllib2.urlopen(url).read() 
soup = BeautifulSoup(page) 

# Get all the links 
links = [str(match) for match in soup('a')] 

s = r'<a href="http://forums.epicgames.com/archive/index.php\?t-\d+.html">(.+?)</a>' 
r = re.compile(s) 
for link in links: 
    m = r.match(link) 
    if m: 
     print m.groups(1)[0] 
+0

Czy można filtrować linki, które chcę ... jak widać w mojej próbie dokonania wyrażeń regularnych, chcę mieć pewien zestaw linków. Dodatkowo i wiem, że pcham szczęście, miałem nadzieję, że otrzymam tekst linku wraz z nim. Krótko mówiąc, czy możliwe jest filtrowanie odsyłaczy i otrzymywanie z nich linku tekstowego? – Btibert3

+0

Kilka rzeczy: co to jest "tekst linku"? Rzeczy między and? Lub wartość href? Lub trochę rzeczy po otwarciu i zamknięcia? Lub coś innego? ¶ Oto, czego nie dostaję: strona, na którą wskażesz, http://forums.epicgames.com/archive/index.php?f-356-p-164.html, nie nawet mają jedno wystąpienie "odpowiedzi" w źródle HTML. Czy jesteś pewien, że tego szukasz? I dlaczego zaakceptowałeś jako odpowiedź wyrażenie regularne, które nie może dorównać żadnym linkom w danych? ¶ – hughdbrown

+0

Nowe do przepełnienia stosu, nie zdawałem sobie sprawy, że to znaczy, że skończyłem, przepraszam. W tekście linku po prostu chcę tekst po łączu w kodzie źródłowym (tekst tuż przed. Odkąd jestem nowy w skrypcie Pythona i skriningu w Internecie, zaczynam powoli i staram się uczyć jak najwięcej. wszystko, co chcę zrobić, to pobrać linki z tego archiwum (każda strona), śledzić każdy link (dyskusję) i pobrać wszystkie posty do tej dyskusji. Będę musiał przeanalizować dane w "zestawie danych", który może być listą, ale po prostu chcę zeskrobać archiwa i zebrać wszystkie tytuły wiadomości i posty dla każdego z nich. – Btibert3

1

Musisz uciec od literału "?" i literału "(" i ")", który próbujesz dopasować.

Również, zamiast "? +", Myślę, że szukasz nie-chciwego dopasowywania podanego przez "+?".

More documentation here.

Twoim przypadku, spróbuj tego:

pattern = r'<a href="http://forums.epicgames.com/archive/index.php\?t-([0-9]+).html"> (.+?)</a> <i>\((.+?) replies\)' 
+0

zmieniłem wzór i prowadził skrypt jeszcze raz i jeszcze nie znaleziono żadnych wyników, przynajmniej ja nie mam nic wydrukowany w oknie, gdy próbuję iteracyjne nad swoje mecze i je wydrukować. Jakieś pomysły? – Btibert3

+0

Sprawdź zawartość pliku ręcznie. Kiedy patrzę na to, nie widzę w nim ciągu "odpowiedzi". Zatem wyrażenie regularne nie znajdzie żadnych dopasowań. – retracile

+0

wzór = r '(.+?) ( \\ (([0-9] +?) Odpowiedzi \\))? może być bliżej? – retracile

1

to oznacza wyrażenie regularne ma błąd.

(.?+)</a> <i>((.?+) 

Co oznacza? Obie ? i + są znakami meta, które nie mają sensu obok siebie. Może zapomniałeś uciec przed "?" lub coś.

+4

Robią sens w drugiej kolejności. +? nie jest chciwą pasującą formą +. – retracile

0

Aby rozszerzyć na to, co inni napisali:

.? oznacza „jeden lub zero jakiegokolwiek charakteru”

+ oznacza „jeden lub więcej charakteru”

Jak można zobaczyć z nadzieją, łącząc dwa nie ma sensu.; są to różne i sprzeczne znaki "powtórzyć". Więc twój błąd dotyczący "wielokrotnych powtórzeń" jest taki, że połączyłeś te dwie "powtórzone" znaki w swoim regularnym wyrażeniu. Aby to naprawić, po prostu zdecyduj, którego chcesz używać, i usuń drugie.

+1

Poza tym. +? nie jest chciwym dopasowaniem jednego lub więcej znaków. Właśnie o to mu chodzi. – retracile

1

Podczas odkrywania, parsowanie dowolnego kodu HTML nie jest łatwe. To właśnie robią pakiety takie jak Beautiful Soup. Pamiętaj, że wywołujesz go w swoim skrypcie, ale nie używasz wyników. Zapoznaj się z jego dokumentacją here, aby dowiedzieć się, jak ułatwić sobie zadanie!

+0

Próbowałem dokumentacji. Ponieważ jestem nowy w Pythonie, a nawet w HTML, trudno mi "łatwo" znaleźć to, czego potrzebuję, chociaż nie mam wątpliwości, że może zrobić to, czego potrzebuję. – Btibert3

Powiązane problemy