2016-04-24 297 views
1

我使用bs4來操縱一些富文本。但它在我做角色轉換的地方刪除了br標籤。下面是代碼的簡單形式。Python bs4刪除br標籤

import re 
from bs4 import BeautifulSoup 

#source_code = self.textInput.toHtml() 
source_code = """.......<p style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu';">ABC ABC<br />ABC</span></p>.......""" 

soup = BeautifulSoup(source_code, "lxml") 

for elm in soup.find_all('span', style=re.compile(r"font-family:'Ubuntu'")): 
#actually there was a for loop 
    elm.string = elm.text.replace("A", "X") 
    elm.string = elm.text.replace("B", "Y") 
    elm.string = elm.text.replace("C", "Z") 

print(soup.prettify()) 

這應該給一個輸出

...<span style=" font-family:'Ubuntu';">XYZ XYZ<br />XYZ</span>... 
#XYZ XYZ 
#XYZ 

但它給輸出,而不BR標籤。

...<span style=" font-family:'Ubuntu';">XYZ XYZXYZ</span>... 
#XYZ XYZXYZ 

我該如何糾正?

回答

2

的問題是,你正在重新定義元素的.string,而是我會找到「文本」節點並提出有更換:

for text in elm.find_all(text=True): 
    text.replace_with(text.replace("A", "X").replace("B", "Y").replace("C", "Z")) 

工作對我來說,生產:

</p> 
    <p style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 
    <span style=" font-family:'Ubuntu';"> 
    XYZ XYZ 
    <br/> 
    XYZ 
    </span> 
</p> 

how can i include this part in a loop?

下面是一個示例:

replacements = { 
    "A": "X", 
    "B": "Y", 
    "C": "Z" 
} 
for text in elm.find_all(text=True): 
    text_to_replace = text 
    for k, v in replacements.items(): 
     text_to_replace = text_to_replace.replace(k, v) 

    text.replace_with(text_to_replace) 
+0

非常感謝你alecxe!但一個簡單的問題是,我如何將這部分包含在循環中? 它提供了一個錯誤 文件「/ usr(」。「)。 /lib/python3/dist-packages/bs4/element.py「,第211行,在replace_with my_index = self.parent.index(self) AttributeError:'NoneType'對象沒有屬性'index' 再次感謝你! – PVGM

+0

很棒@alecxe !!非常感謝您的建議...... – PVGM