日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

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

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

你可能會(huì)覺得這個(gè)功能很簡(jiǎn)單,不就是字符串替換嗎?那你可以試一試把下面這個(gè)HTML片段中的

標(biāo)簽下面的英文翻譯成中文。其它標(biāo)簽中的不要改動(dòng):


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.


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

你一拍腦袋,馬上寫出了下面這幾行代碼(假設(shè)你已經(jīng)有了一個(gè)現(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)
...

當(dāng)你寫到這里,你應(yīng)該會(huì)愣一下。因?yàn)槟阃蝗话l(fā)現(xiàn)一個(gè)問題,怎么把中文替換回去?

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

一個(gè)比較笨的辦法是直接對(duì)原始的HTML字符串進(jìn)行文本替換:

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

但這樣做,效率非常低。因?yàn)槟阋煌呙枵麄€(gè)HTML字符串。一般一個(gè)中型網(wǎng)站的HTML就有幾千上萬行,十幾二十萬個(gè)字符。你每翻譯一小段就全文替換一次,這個(gè)時(shí)間會(huì)非常漫長(zhǎng)。

那有沒有辦法只對(duì)當(dāng)前這一個(gè)

?標(biāo)簽里面的文本進(jìn)行替換呢?關(guān)鍵的問題來了,你替換可以,但是怎么才能不影響這個(gè)

標(biāo)簽下面的兩個(gè)子標(biāo)簽?要保證文本和子標(biāo)簽的相對(duì)位置不改變。

如果

標(biāo)簽下面只有一段文本,沒有子標(biāo)簽,那么非常簡(jiǎn)單,如下圖所示:

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

標(biāo)簽下面有三段文本。每段文本之間還插入了其它的子標(biāo)簽。我們?cè)趺礃訉?duì)每一段文本進(jìn)行替換,但是又保持文本的相對(duì)順序,并且還不能影響子標(biāo)簽?

p.text這種寫法首先就可以排除了,因?yàn)樗鼪]有辦法指定替換第幾段文本。

你之所以會(huì)覺得這個(gè)問題很難解決,是因?yàn)槟阌幸粋€(gè)錯(cuò)覺,請(qǐng)看上面這張截圖,我打印了text_list?。打印出來是一個(gè)包含字符串的列表。所以你可能會(huì)覺得。使用lxml寫Xpath的時(shí)候,/text()返回的總是包含字符串的列表。

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

不是字符串就簡(jiǎn)單了,那么我們可以獲取每一個(gè)文本對(duì)象的父標(biāo)簽。然后修改父標(biāo)簽下面的文本就可以了。

看到這里,你肯定會(huì)問,這三個(gè)文本節(jié)點(diǎn)的父標(biāo)簽,不都是同一個(gè)

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

其實(shí)只有第一段文本的父標(biāo)簽是

?。第二段文本的父標(biāo)簽,竟然是

?的子標(biāo)簽?。第三段文本的父標(biāo)簽,是。

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

下面的第二段文本呢?

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

那么,

?的第二段文本跟這個(gè)?標(biāo)簽是什么關(guān)系?實(shí)際上,這個(gè)關(guān)系叫做tail。如下圖所示:

在一個(gè)標(biāo)簽里面,只有第一段text?是它真正的text()?,如果這個(gè)標(biāo)簽有子標(biāo)簽,那么位于子標(biāo)簽后面的文本,是這個(gè)子標(biāo)簽的tail?。只不過當(dāng)我們?cè)谡齽t表達(dá)式里面寫/text()?的時(shí)候,lxml會(huì)幫我們把所有子標(biāo)簽的tail都算作當(dāng)前標(biāo)簽的text。

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

? ?


文章題目:一日一技:使用Python翻譯HTML中的文本字符串
文章地址:http://www.dlmjj.cn/article/cdjodhc.html