2012-04-20 12 views

Odpowiedz

9

Twoje pytanie ma dwie części:

  1. obracając jeden NavigableString "Ten tekst jest mój" w NavigableString, znacznik, a inny NavigableString.

  2. Wymiana NavigableString "Ten tekst jest mój" z trzema nowymi elementami.

Odpowiedź na nr 1 zależy od twojej sytuacji. W szczególności zależy to od tego, w jaki sposób ustalasz, która część tekstu wymaga połączenia. Użyję wyrażeń regularnych, aby znaleźć ciąg "tekst":

from bs4 import BeautifulSoup 
data = '<p>This text is my <a href="#">text</a><p>' 

soup = BeautifulSoup(data) 
original_string = soup.p.contents[0] 

print(original_string) 
# "This text is my " 

import re 
this, text, is_my = re.compile("(text)").split(original_string) 

Teraz dla # 2. To nie jest tak proste, jak mogłoby być, ale jest to zdecydowanie możliwe. Po pierwsze, Turn text w Tag zawierającego tekst linku:

text_link = soup.new_tag("a", href="#") 
text_link.string = text 

re.split() okazało this i is_my w zwykłych ciągów Unicode. Włączyć je z powrotem do NavigableString s, aby mogli wrócić do drzewa jako elementów:

this = soup.new_string(this) 
is_my = soup.new_string(is_my) 

Teraz użyj replace_with() i insert_after zastąpić starą elementu z trzech nowych elementów:

original_string.replace_with(this) 
this.insert_after(text_link) 
text_link.insert_after(is_my) 

Teraz drzewo powinien wyglądać tak, jak chcesz:

print(soup.p) 
# <p>This <a href="#">text</a> is my <a href=""></a></p> 
0

Możesz pobrać tekst NavigableString, zmodyfikować go, zbudować nowy model obiektu z zmodyfikowany tekst, a następnie zamień stary NavigableString na ten model obiektu:

data = '<p>This text is my <a href="#">text</a><p>' 
soup = BeautifulSoup(data) 
original_string = soup.p.contents[0] 
new_text = unicode(original_string).replace('text', '<a href="#">text</a>') 
original_string.replaceWith(BeautifulSoup(text)) 
Powiązane problemy