2012-04-20 52 views
8

Nói rằng tôi có mảnh này của HTML:BeautifulSoup: Làm cách nào để thay thế giá trị trong phần tử có thẻ phần tử?

<p>This text is my <a href="#">text</a><p> 

Làm thế nào để thay thế các "văn bản" đầu tiên với một phần tử neo, vì vậy kết quả trở thành:

<p>This <a href="#">text</a> is my <a href="#">text</a><p> 

tôi về cơ bản muốn thay thế một chuỗi con trong một NavigableString với một Thẻ.

Trả lời

9

Câu hỏi của bạn có hai phần:

  1. Biến NavigableString single "Văn bản này là của tôi" vào một NavigableString, một Tag, và một NavigableString.

  2. Thay thế NavigableString "Văn bản này là của tôi" với ba phần tử mới.

Câu trả lời cho # 1 tùy thuộc vào trường hợp của bạn. Cụ thể là nó phụ thuộc vào cách bạn xác định phần nào của văn bản cần liên kết. Tôi sẽ sử dụng cụm từ thông dụng để tìm chuỗi "văn bản":

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) 

Bây giờ cho # 2. Đây không phải là dễ dàng như nó có thể được, nhưng nó chắc chắn có thể. Đầu tiên, Turn text thành một Tag chứa văn bản liên kết:

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

re.split() quay thisis_my thành chuỗi Unicode bình thường. Biến chúng trở lại vào NavigableString s để họ có thể quay trở lại vào cây như yếu tố:

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

Bây giờ sử dụng replace_with()insert_after để thay thế các yếu tố cũ với ba yếu tố mới:

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

Bây giờ cây của bạn nên xem theo cách bạn muốn:

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

Bạn có thể lấy văn bản của NavigableString, sửa đổi nó, tạo mô hình đối tượng mới từ văn bản đã sửa đổi và sau đó thay thế NavigableString cũ bằng mô hình đối tượng này:

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)) 
Các vấn đề liên quan