2016-07-27 3 views
-3

として機能していないが、私のHTMLコードです:ここで正規表現は、ここで必要な

<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> 

は私のPythonコードです:

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) 

問題は、意図したとおり、それは「../」とのリンクを検出しているだけでなく、 "../../"が変更されました。私はURLを単一の "../"で選ぶように正規表現を制限する方法はありますか?

予想される出力:

<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

をしてください –

+0

@ThomasAyoub拝啓は、私が許可されていないのです...代わりに正規表現のパーサを使用します正規表現以外のものを使う私の会社の制限。 –

+0

ここには当てはまりません。上司から聞いたときに、彼は自分が望むことを何でもする権利を持っています。 –

答えて

2

を文字列に置き換えることができます、

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

努力のおかげで。 :) –

+1

いつも歓迎します。 –

+1

もっと最適化! –

1

次を使用してみてください:

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

スラッシュの後に単語文字がなければならないことを保証します。

+0

ありがとうございます。私は10時間以上かけて別のものをテストするようになりました。 –

+1

問題はありませんが、あなたの上司がそれを気に入らなくても正規表現の代わりにパーサーを使うことを検討するべきです。 – GiftZwergrapper

+1

@Giftwergrapperさて、彼を説得しようとします。 –

2

あなたが要求したとしてBeautifulSoupを使用することで、正規表現を使用して

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

@GiftZwergrapperメソッドを試してみます。 –

+0

両方のリンクで "/"の後ろの最初の "s"も選択しています –

+0

regexは正常に機能していますが、Pythonコードでは奇妙な出力を出しています。 –

関連する問題