2012-04-20 5 views
8

कहो कि मैं HTML के इस टुकड़े है:सुंदर सूप: तत्व तत्व के साथ किसी तत्व में मान को कैसे प्रतिस्थापित करें?

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

मैं कैसे एक एंकर तत्व के साथ पहली बार "पाठ" की जगह है, इसलिए परिणाम हो जाता है:

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

मैं मूल रूप से एक बदलना चाहते हैं एक टैग के साथ एक NavigableString में सबस्ट्रिंग।

उत्तर

9

आपका प्रश्न के दो भाग हैं:

  1. एकल NavigableString टर्निंग "यह पाठ है मेरी" एक NavigableString, एक टैग, और एक अन्य NavigableString में।

  2. नेविगेलस्ट्रिंग को बदलना "यह पाठ मेरा नया है" तीन नए तत्वों के साथ।

# 1 का उत्तर आपकी स्थिति पर निर्भर करता है। विशेष रूप से यह इस बात पर निर्भर करता है कि आप कैसे निर्धारित करते हैं कि पाठ के किस हिस्से को जोड़ने की आवश्यकता है। मैं स्ट्रिंग "टेक्स्ट" खोजने के लिए एक नियमित अभिव्यक्ति का उपयोग करूंगा:

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) 

अब # 2 के लिए। यह जितना आसान हो सकता है उतना आसान नहीं है, लेकिन यह निश्चित रूप से संभव है। सबसे पहले, एक Tag लिंक पाठ वाले मुड़ें text:

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

re.split() साधारण यूनिकोड स्ट्रिंग में this और is_my बदल गया। NavigableString रों में उन्हें वापस कर दें ताकि वे तत्व के रूप में पेड़ में वापस जा सकते हैं:

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

अब replace_with() और insert_after का उपयोग तीन नए तत्वों के साथ पुराने तत्व को बदलने के लिए:

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

अब आप अपने पेड़ जिस तरह से आप के लिए यह चाहते दिखना चाहिए:

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

आप NavigableString के पाठ प्राप्त कर सकते हैं, इसे संशोधित, से नए ऑब्जेक्ट मॉडल का निर्माण संशोधित पाठ और फिर इस ऑब्जेक्ट मॉडल के साथ पुरानी नेविगेलस्ट्रिंग को प्रतिस्थापित करें:

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