2016-07-27 13 views
-3

Hier ist mein HTML-Code:Regex funktioniert nicht wie erforderlich

<ul class="hide menuSearchType"> 
    <li><a href="../../dynamic/city_select.aspx">Search by city</a></li> 
    <li><a href="../../searchbyphone.aspx">Search by phone</a></li> 
    <li><a href="../searchbyaddress.aspx">Search by address</a></li> 
    <li><a href="../searchbybrand.aspx">Search by brand</a></li> 
    <li><a href="/advertisement-center/">Advertise with us</a></li> 
    <li><a href="/advertisement-center/">Advertise with us</a></li> 
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li> 
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li> 
    <li><a href="dynamic/city_select.aspx">Search by city</a></li> 
    <li><a href="searchbybrand.aspx">Search by brand</a></li> 
</ul> 

Hier ist mein Python-Code:

import re, os 
from urllib.parse import urlparse 

url = "http://www.phonebook.com.pk/dynamic/search.aspx?searchtype=cat&class_id=2566" 

path = urlparse(url) 
lpath = os.path.dirname(path.path) 

html = u"<ul class=\"hide menuSearchType\">\n <li><a href=\"../../dynamic/city_select.aspx\">Search by city</a></li>\n <li><a href=\"../../searchbyphone.aspx\">Search by phone</a></li>\n <li><a href=\"../searchbyaddress.aspx\">Search by address</a></li>\n <li><a href=\"../searchbybrand.aspx\">Search by brand</a></li>\n <li><a href=\"/advertisement-center/\">Advertise with us</a></li>\n <li><a href=\"/advertisement-center/\">Advertise with us</a></li>\n <li><a href=\"//fonts.googleapis.com/css?family=Open+Sans\">Find a Person</a></li>\n <li><a href=\"//fonts.googleapis.com/css?family=Open+Sans\">Find a Person</a></li>\n <li><a href=\"dynamic/city_select.aspx\">Search by city</a></li>\n <li><a href=\"searchbybrand.aspx\">Search by brand</a></li>\n</ul>" 

linkList1 = re.findall(re.compile(u'(?<=href=")../.*?(?=")'), str(html)) 

for link1 in linkList: 
    html = re.sub(link1, path.scheme + "://" + os.path.normpath(path.netloc + os.path.abspath(lpath + "/" + link1)), str(html)) 

print (html) 

Problem ist es, die Verbindungen mit erkennt "../" bestimmt, wie aber auch "../../" wurde geändert, gibt es eine Möglichkeit, meine Regex so einzuschränken, dass ich die URLs nur mit "../" auswähle?

Erwarteter Ausgang:

<ul class="hide menuSearchType"> 
    <li><a href="../../dynamic/city_select.aspx">Search by city</a></li> 
    <li><a href="../../searchbyphone.aspx">Search by phone</a></li> 
    <li><a href="http://www.phonebook.com.pk/searchbyaddress.aspx">Search by address</a></li> 
    <li><a href="http://www.phonebook.com.pk/searchbybrand.aspx">Search by brand</a></li> 
    <li><a href="/advertisement-center/">Advertise with us</a></li> 
    <li><a href="/advertisement-center/">Advertise with us</a></li> 
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li> 
    <li><a href="//fonts.googleapis.com/css?family=Open+Sans">Find a Person</a></li> 
    <li><a href="dynamic/city_select.aspx">Search by city</a></li> 
    <li><a href="searchbybrand.aspx">Search by brand</a></li> 
</ul> 
+1

bitte, einen Parser zu verwenden, anstatt reguläre Ausdrücke ... –

+0

@ThomasAyoub Sehr geehrter Herr ich bin nicht erlaubt etwas anderes als Regex zu verwenden. Die Einschränkung meines Unternehmens. –

+0

Das trifft hier nicht zu, wenn Sie von Ihrem Chef hören, dass er das Recht hat zu tun, was er will. –

Antwort

2

von BeautifulSoup Verwendung als angefordert:

from bs4 import Beautifulsoup 
soup = BeautifulSoup(html) 
all = soup.select('li') 
for i in all: 
    try: 
     output = re.sub(r'(?is)(href="../)([^.])','http://www.phonebook.com.pk/'+r'\2',str(i)) 
    except: 
     output = i 
    print(output) 
+0

danke für die Mühe. :) –

+1

immer willkommen :) –

+1

mehr optimiert! –

1

Versuchen Sie, die mit folgenden:

linkList1 = re.findall(re.compile(u'(?<=href=")../\w.*?(?=")'), str(html)) 

Das garantiert, dass ein Wortzeichen nach dem Schrägstrich sein muss.

+0

Dank, Sie lösten mein Problem, das dauerte mir 10+ Stunden, um verschiedene Dinge zu testen. –

+1

Kein Problem, aber Sie sollten in Erwägung ziehen, einen Parser anstelle von Regex zu verwenden, obwohl Ihr Chef es nicht mag. – GiftZwergrapper

+1

@Giftwergrapper Okay, ich werde versuchen, ihn zu überzeugen. –

2

Sie können ersetzen String regex,

output = re.sub(r'(?is)(href="../)([^.])','http://www.phonebook.com.pk/'+r'\2',str(html)) 
+0

Ich werde nach @GiftZwergrapper Methode versuchen. –

+0

Es wählt auch das erste "s" nach "/" in beiden Links –

+0

Regex funktioniert gut, aber in Python-Code gibt es ungerade Ausgabe. –