2016-08-01 15 views
0

Der Versuch, die folgende Logik zu erreichen:Anchors (<a href="URL">URL</a>) anstelle von Text (<p>URL</p>)

Wenn URL in Text von Absatz-Tags (Beispiel: <p>URL</p>) umgeben ist, ersetzen Sie es an Ort und Stelle einen Link zu werden, anstatt : <a href="URL">Click Here</a>

Die ursprüngliche Datei ist ein Datenbankabbild (sql, UTF-8). Einige URLs existieren bereits im gewünschten Format. Ich muss die fehlenden Links beheben.

Ich arbeite an einem Skript, das Beautifulsoup verwendet. Wenn andere Lösungen sinnvoller sind (Regex, etc.), bin ich offen für Vorschläge.

+0

Bitte geben Sie einige Beispiele dafür, was Sie bereits getan haben, beachten Sie irgendwelche Probleme Sie haben. – Will

Antwort

0

Sie können nach allen Elementen suchen, deren Text mit http beginnt. Dann replace it with ein Link:

for elm in soup.find_all("p", text=lambda text: text and text.startswith("http")): 
    elm.replace_with(soup.new_tag("a", href=elm.get_text())) 

Beispiel Arbeitscode:

from bs4 import BeautifulSoup 

data = """ 
<div> 
    <p>http://google.com</p> 
    <p>https://stackoverflow.com</p> 
</div> 
""" 

soup = BeautifulSoup(data, "html.parser") 
for elm in soup.find_all("p", text=lambda text: text and text.startswith("http")): 
    elm.replace_with(soup.new_tag("a", href=elm.get_text())) 

print(soup.prettify()) 

Drucke:

<div> 
    <a href="http://google.com"></a> 
    <a href="https://stackoverflow.com"></a> 
</div> 

kann ich diesen Ansatz Pause vorstellen, aber es sollte ein guter Start für Sie sein.


Wenn Sie zusätzlich Texte hinzufügen möchten Ihre Links, setzen Sie die .string Eigenschaft:

soup = BeautifulSoup(data, "html.parser") 
for elm in soup.find_all("p", text=lambda text: text and text.startswith("http")): 
    a = soup.new_tag("a", href=elm.get_text()) 
    a.string = "link" 
    elm.replace_with(a) 
+0

Alexander, danke für deine schnelle Antwort. Ich habe deine Lösung getestet. Es funktioniert ziemlich gut. Noch eine kurze Frage, wenn es Ihnen nichts ausmacht. Wie dekoriere ich die Anker mit einem statischen Text, damit sie nicht leer erscheinen? Zum Beispiel, a href = "http://google.com> Klicken Sie hier statt nur leere Tags? – bytebybyte

+0

@bytebybyte sicher, aktualisiert die Antwort. Froh, zu helfen. – alecxe

Verwandte Themen