2009-02-26 13 views
2

ich einige Codes von einer Webseite zu extrahieren (http://www.opensolaris.org/os/community/on/flag-days/all/) wie folgt,Wie eine relative URL zu finden und es auf eine absolute URL in Python übersetzen

<tr class="build"> 
    <th colspan="0">Build 110</th> 
</tr> 
<tr class="arccase project flagday"> 
    <td>Feb-25</td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td> 
    <a href="../pages/2009022501/">Flag Day and Heads Up: Power Aware Dispatcher and Deep C-States</a><br /> 
    cpupm keyword mode extensions - <a href="/os/community/arc/caselog/2008/777/">PSARC/2008/777</a><br /> 
    CPU Deep Idle Keyword - <a href="/os/community/arc/caselog/2008/663/">PSARC/2008/663</a><br /> 
    </td> 
</tr> 

und es gibt einige relativen Pfade url darin, jetzt Ich möchte es mit regulärem Ausdruck suchen und sie durch absoluten URL-Pfad ersetzen. Da ich weiß, urljoin kann die Arbeit so ersetzen tun,

>>> urljoin("http://www.opensolaris.org/os/community/on/flag-days/all/", 
...   "/os/community/arc/caselog/2008/777/") 
'http://www.opensolaris.org/os/community/arc/caselog/2008/777/' 

Jetzt möchte ich wissen, dass, wie sie mit regulären Ausdrücken zu suchen, und tanslate schließlich den Code,

<tr class="build"> 
    <th colspan="0">Build 110</th> 
</tr> 
<tr class="arccase project flagday"> 
    <td>Feb-25</td> 
    <td></td> 
    <td></td> 
    <td></td> 
    <td> 
    <a href="http://www.opensolaris.org/os/community/on/flag-days/all//pages/2009022501/">Flag Day and Heads Up: Power Aware Dispatcher and Deep C-States</a><br /> 
    cpupm keyword mode extensions - <a href="http://www.opensolaris.org/os/community/arc/caselog/2008/777/">PSARC/2008/777</a><br /> 
    CPU Deep Idle Keyword - <a href="http://www.opensolaris.org/os/community/arc/caselog/2008/663/">PSARC/2008/663</a><br /> 
    </td> 
</tr> 

Mein Wissen über Reguläre Ausdrücke sind so schlecht, dass ich wissen möchte, wie das geht. Danke

Ich habe die Arbeit mit Beautiful Soup beendet, haha ​​~ Thx für alle!

+0

Und es ist ein Duplikat: http://stackoverflow.com/questions/442660/link-extraction-in-python-closed –

Antwort

3

Zuerst würde ich empfehlen, einen HTML-Parser wie BeautifulSoup zu verwenden. HTML ist keine reguläre Sprache und kann daher nicht vollständig von regulären Ausdrücken analysiert werden. Teile von HTML können jedoch analysiert werden.

Wenn Sie nicht über einen vollständigen HTML-Parser verwenden mögen, können Sie so etwas wie dies nutzen, um die Arbeit zu nähern:

import re, urlparse 

find_re = re.compile(r'\bhref\s*=\s*("[^"]*"|\'[^\']*\'|[^"\'<>=\s]+)') 

def fix_urls(document, base_url): 
    ret = [] 
    last_end = 0 
    for match in find_re.finditer(document): 
     url = match.group(1) 
     if url[0] in "\"'": 
      url = url.strip(url[0]) 
     parsed = urlparse.urlparse(url) 
     if parsed.scheme == parsed.netloc == '': #relative to domain 
      url = urlparse.urljoin(base_url, url) 
      ret.append(document[last_end:match.start(1)]) 
      ret.append('"%s"' % (url,)) 
      last_end = match.end(1) 
    ret.append(document[last_end:]) 
    return ''.join(ret) 

Beispiel:

>>> document = '''<tr class="build"><th colspan="0">Build 110</th></tr> <tr class="arccase project flagday"><td>Feb-25</td><td></td><td></td><td></td><td><a href="../pages/2009022501/">Flag Day and Heads Up: Power Aware Dispatcher and Deep C-States</a><br />cpupm keyword mode extensions - <a href="/os/community/arc/caselog/2008/777/">PSARC/2008/777</a><br /> CPU Deep Idle Keyword - <a href="/os/community/arc/caselog/2008/663/">PSARC/2008/663</a><br /></td></tr>''' 
>>> fix_urls(document,"http://www.opensolaris.org/os/community/on/flag-days/all/") 
'<tr class="build"><th colspan="0">Build 110</th></tr> <tr class="arccase project flagday"><td>Feb-25</td><td></td><td></td><td></td><td><a href="http://www.opensolaris.org/os/community/on/flag-days/pages/2009022501/">Flag Day and Heads Up: Power Aware Dispatcher and Deep C-States</a><br />cpupm keyword mode extensions - <a href="http://www.opensolaris.org/os/community/arc/caselog/2008/777/">PSARC/2008/777</a><br /> CPU Deep Idle Keyword - <a href="http://www.opensolaris.org/os/community/arc/caselog/2008/663/">PSARC/2008/663</a><br /></td></tr>' 
>>> 
+0

Vielen Dank für Ihre Hilfe ~ Eigentlich habe ich Beautiful Soup in meinem Code verwendet, aber nur einige Funktionen, um Inhalte zwischen Tags zu extrahieren und einige Tags zu entfernen . Ich lese sein Dokument sorgfältig und finde den besseren Weg, um das Ziel zu erreichen ~ – lucas

+0

Ich habe die Arbeit mit Beautiful Soup abgeschlossen, haha ​​~ – lucas

6

Ich bin mir nicht sicher, was Sie erreichen möchten, aber die Verwendung der BASE tag in HTML kann diesen Trick für Sie tun, ohne bei der Verarbeitung auf reguläre Ausdrücke zurückgreifen zu müssen.

1

So etwas sollte es tun:

"(?:[^/:"]+|/(?!/))(?:/[^/"]+)*" 
2

Verwenden Sie reguläre Ausdrücke nicht HTML zu analysieren. Verwenden Sie einen echten Parser dafür. Zum Beispiel BeautifulSoup.

+0

Thx ~ Ich werde das Dokument von BeautifulSoup sorgfältig lesen und den Weg finden, um das Ziel zu erreichen – lucas

2

dies nicht elegant ist, aber macht den Job:

import re 
from urlparse import urljoin 
relative_urls_re = re.compile('(<\s*a[^>]+href\s*=\s*["\']?)(?!http)([^"\'>]+)', re.IGNORECASE) 
relative_urls_re.sub(lambda m: m.group(1) + urljoin(base_url, m.group(2)), html) 
Verwandte Themen