日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一日一技:使用Python翻譯HTML中的文本字符串

一鍵翻譯成中文以后是這樣的:

你可能會覺得這個功能很簡單,不就是字符串替換嗎?那你可以試一試把下面這個HTML片段中的

標簽下面的英文翻譯成中文。其它標簽中的不要改動:


if you want to parse date and time, your could use datetime, by use this library, you can generate now time by one line code datetime.datetime.now() this is so easy.


?標簽中的datetime和?標簽中的datetime.datetime.now()不需要翻譯。

你一拍腦袋,馬上寫出了下面這幾行代碼(假設你已經(jīng)有了一個現(xiàn)成的translate()函數(shù),傳入英文,輸出中文):

from lxml.html import fromstring
source = '''

if you want to parse date and time, your could use datetime, by use this library, you can generate now time by one line code datetime.datetime.now() this is so easy.



'''

selector = fromstring(source)
text_list = selector.xpath('//p/text()')
for text in text_list:
chinese = translate(text)
...

當你寫到這里,你應該會愣一下。因為你突然發(fā)現(xiàn)一個問題,怎么把中文替換回去?

不用嘗試去百度了。在今天(2022-06-20)之前,整個中文網(wǎng)絡里面,你找不到解決方法。

一個比較笨的辦法是直接對原始的HTML字符串進行文本替換:

for text in text_list:
chinese = translate(text)
source = source.replace(text, chinese)

但這樣做,效率非常低。因為你要不停掃描整個HTML字符串。一般一個中型網(wǎng)站的HTML就有幾千上萬行,十幾二十萬個字符。你每翻譯一小段就全文替換一次,這個時間會非常漫長。

那有沒有辦法只對當前這一個

?標簽里面的文本進行替換呢?關鍵的問題來了,你替換可以,但是怎么才能不影響這個

標簽下面的兩個子標簽?要保證文本和子標簽的相對位置不改變。

如果

標簽下面只有一段文本,沒有子標簽,那么非常簡單,如下圖所示:

但現(xiàn)在的問題是,

標簽下面有三段文本。每段文本之間還插入了其它的子標簽。我們怎么樣對每一段文本進行替換,但是又保持文本的相對順序,并且還不能影響子標簽?

p.text這種寫法首先就可以排除了,因為它沒有辦法指定替換第幾段文本。

你之所以會覺得這個問題很難解決,是因為你有一個錯覺,請看上面這張截圖,我打印了text_list?。打印出來是一個包含字符串的列表。所以你可能會覺得。使用lxml寫Xpath的時候,/text()返回的總是包含字符串的列表。

但實際上,返回的列表里面的元素并不是字符串,而是_ElementUnicodeResult對象。如下圖所示:

不是字符串就簡單了,那么我們可以獲取每一個文本對象的父標簽。然后修改父標簽下面的文本就可以了。

看到這里,你肯定會問,這三個文本節(jié)點的父標簽,不都是同一個

嗎?如果你覺得是,那你就犯了想當然的錯誤。我們用代碼來看看:

其實只有第一段文本的父標簽是

?。第二段文本的父標簽,竟然是

?的子標簽?。第三段文本的父標簽,是

等等,如果第二段文本的父標簽是?,那么datetime?里面的datetime?的父標簽是什么?它的父標簽也是?!那么問題來了,的text()?文本節(jié)點,怎么可能又是datetime?,又是

下面的第二段文本呢?

實際上,的text()?始終都是datetime。如下圖所示:

那么,

?的第二段文本跟這個?標簽是什么關系?實際上,這個關系叫做tail。如下圖所示:

在一個標簽里面,只有第一段text?是它真正的text()?,如果這個標簽有子標簽,那么位于子標簽后面的文本,是這個子標簽的tail?。只不過當我們在正則表達式里面寫/text()?的時候,lxml會幫我們把所有子標簽的tail都算作當前標簽的text。

我們可以使用文本節(jié)點的.is_text和.is_tail來判斷它屬于哪種文本。最終運行效果如下圖所示:

? ?


當前名稱:一日一技:使用Python翻譯HTML中的文本字符串
URL分享:http://www.5511xx.com/article/cdjodhc.html