2010-10-19 62 views
1

有沒有辦法使用lxml.html刪除/轉義html標籤,而不是美麗的有一些xss的問題?我嘗試使用更清潔,但我想刪除所有的HTML。刪除python中的所有html?

+7

如何beautifulsoup具有跨站點腳本問題? – jball 2010-10-19 22:40:02

回答

9

嘗試在元素上使用.text_content()方法,在使用lxml.html.clean來擺脫不需要的內容(腳本標籤等)後可能是最好的方法。例如:

from lxml import html 
from lxml.html.clean import clean_html 

tree = html.parse('http://www.example.com') 
tree = clean_html(tree) 

text = tree.getroot().text_content() 
+0

我想擺脫一切,不只是不安全的標籤 – Timmy 2010-10-20 13:26:12

+1

如果你想擺脫一切,爲什麼不只是'text ='''? ;-)嚴重的是,'text_content()'將擺脫所有的標記,但清洗也將擺脫例如。 CSS樣式表規則和JavaScript,它們也被編碼爲文本*裏面*元素(但我認爲你只對「真實」文本感興趣,因此首先進行清理) – Steven 2010-10-20 14:09:57

+0

正在使用clean_html(字符串),它在不同事物 – Timmy 2010-10-20 20:18:26

11

我相信,這個代碼可以幫助您:

from lxml.html.clean import Cleaner 

html_text = "<html><head><title>Hello</title><body>Text</body></html>" 
cleaner = Cleaner(allow_tags=[''], remove_unknown_tags=False) 
cleaned_text = cleaner.clean_html(html_text) 
+0

經過一個快速的實驗,這個解決方案似乎比這個更好的工作,例如http://stackoverflow.com/a/5332984/787842,但我想知道更多關於正確參數化'Cleaner'對象的方法(因爲有很多選項)。例如在這種情況下,在邏輯上,讓一個空的'allow_tags'列表和'remove_unknown_tags'設置爲'False'在我看來有點奇怪。 – cjauvin 2015-05-11 14:40:04

+0

@cjauvin:當然,你是對的!這是一種破解。但是我確定沒有人想要在參數'remove_tags'中指定所有必須刪除的標籤,如果他們想要刪除它們。不幸的是,在這種情況下,'Cleaner'的實現鼓勵用戶使用帶有'remove_unknown_tags'的'allow_tags'來達到這個目的https://github.com/lxml/lxml/blob/54a8bfedcd0f32274a4ebf9e2d8e391fe759aba5/src/lxml/html/clean.py#L387 – dni 2015-05-13 12:31:17