欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Python實(shí)現(xiàn)翻譯HTML中的文本字符串

 更新時(shí)間:2022年06月21日 09:57:01   作者:kingname  
這篇文章主要為大家介紹了如何利用Python實(shí)現(xiàn)翻譯HTML中的文本字符串功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下

相信大家都用過(guò)瀏覽器的翻譯網(wǎng)頁(yè)功能,例如對(duì)于下圖這個(gè)英文網(wǎng)頁(yè):

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

你可能會(huì)覺(jué)得這個(gè)功能很簡(jiǎn)單,不就是字符串替換嗎?那你可以試一試把下面這個(gè)HTML片段中的<p>標(biāo)簽下面的英文翻譯成中文。其它標(biāo)簽中的不要改動(dòng):

<div>
?<p>if?you?want?to?parse?date?and?time,?your?could?use?<em>datetime</em>,?by?use?this?library,?you?can?generate?now?time?by?one?line?code?<span>datetime.datetime.now()</span>?this?is?so?easy.</p>
</div>

<em>標(biāo)簽中的datetime<span>標(biāo)簽中的datetime.datetime.now()不需要翻譯。

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

from?lxml.html?import?fromstring
source?=?'''<div>
?<p>if?you?want?to?parse?date?and?time,?your?could?use?<em>datetime</em>,?by?use?this?library,?you?can?generate?now?time?by?one?line?code?<span>datetime.datetime.now()</span>?this?is?so?easy.</p>
</div>
'''

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è)問(wèn)題,怎么把中文替換回去?

不用嘗試去百度了。在今天(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就有幾千上萬(wàn)行,十幾二十萬(wàn)個(gè)字符。你每翻譯一小段就全文替換一次,這個(gè)時(shí)間會(huì)非常漫長(zhǎng)。

那有沒(méi)有辦法只對(duì)當(dāng)前這一個(gè)<p>標(biāo)簽里面的文本進(jìn)行替換呢?關(guān)鍵的問(wèn)題來(lái)了,你替換可以,但是怎么才能不影響這個(gè)<p>標(biāo)簽下面的兩個(gè)子標(biāo)簽?要保證文本和子標(biāo)簽的相對(duì)位置不改變。

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

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

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

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

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

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

看到這里,你肯定會(huì)問(wèn),這三個(gè)文本節(jié)點(diǎn)的父標(biāo)簽,不都是同一個(gè)<p>嗎?如果你覺(jué)得是,那你就犯了想當(dāng)然的錯(cuò)誤。我們用代碼來(lái)看看:

其實(shí)只有第一段文本的父標(biāo)簽是<p>。第二段文本的父標(biāo)簽,竟然是<p>的子標(biāo)簽<em>。第三段文本的父標(biāo)簽,是<span>。

等等,如果第二段文本的父標(biāo)簽是<em>,那么<em>datetime</em>里面的datetime的父標(biāo)簽是什么?它的父標(biāo)簽也是<em>!那么問(wèn)題來(lái)了,<em>text()文本節(jié)點(diǎn),怎么可能又是datetime,又是<p>下面的第二段文本呢?

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

那么,<p>的第二段文本跟這個(gè)<em>標(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。只不過(guò)當(dāng)我們?cè)谡齽t表達(dá)式里面寫/text()的時(shí)候,lxml會(huì)幫我們把所有子標(biāo)簽的tail都算作當(dāng)前標(biāo)簽的text。

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

以上就是利用Python實(shí)現(xiàn)翻譯HTML中的文本字符串的詳細(xì)內(nèi)容,更多關(guān)于Python翻譯HTML中字符串的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python無(wú)損壓縮圖片的示例代碼

    Python無(wú)損壓縮圖片的示例代碼

    這篇文章主要介紹了Python無(wú)損壓縮圖片的方法,簡(jiǎn)單的代碼即可實(shí)現(xiàn)壓縮圖片,感興趣的朋友可以了解下
    2020-08-08
  • python正則過(guò)濾字母、中文、數(shù)字及特殊字符方法詳解

    python正則過(guò)濾字母、中文、數(shù)字及特殊字符方法詳解

    這篇文章主要介紹了python正則過(guò)濾字母、數(shù)字及特殊字符方法詳解,需要的朋友可以參考下
    2020-02-02
  • 關(guān)于Python中compile() 函數(shù)簡(jiǎn)單實(shí)用示例詳解

    關(guān)于Python中compile() 函數(shù)簡(jiǎn)單實(shí)用示例詳解

    這篇文章主要介紹了關(guān)于compile() 函數(shù)簡(jiǎn)單實(shí)用示例,compile() 函數(shù)將一個(gè)字符串編譯為字節(jié)代碼,compile將代碼編譯為代碼對(duì)象,應(yīng)用在代碼中可以提高效率,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Python中的Numpy 矩陣運(yùn)算

    Python中的Numpy 矩陣運(yùn)算

    這篇文章介紹Python中的Numpy 矩陣運(yùn)算,NumPy是Python的一種開(kāi)源的數(shù)值計(jì)算擴(kuò)展.這種工具可用來(lái)存儲(chǔ)和處理大型矩陣,比Python自身的嵌套列表結(jié)構(gòu)要高效的多,支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù),下面詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Python讀取鍵盤輸入的2種方法

    Python讀取鍵盤輸入的2種方法

    這篇文章主要介紹了Python讀取鍵盤輸入的2種方法,主要使用的就是raw_input函數(shù)和input函數(shù),本文分別給出使用實(shí)例,需要的朋友可以參考下
    2015-06-06
  • pycharm使用技巧之自動(dòng)調(diào)整代碼格式總結(jié)

    pycharm使用技巧之自動(dòng)調(diào)整代碼格式總結(jié)

    這篇文章主要給大家介紹了關(guān)于pycharm使用技巧之自動(dòng)調(diào)整代碼格式總結(jié)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Softmax函數(shù)原理及Python實(shí)現(xiàn)過(guò)程解析

    Softmax函數(shù)原理及Python實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Softmax函數(shù)原理及Python實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 解決pycharm無(wú)法識(shí)別本地site-packages的問(wèn)題

    解決pycharm無(wú)法識(shí)別本地site-packages的問(wèn)題

    今天小編就為大家分享一篇解決pycharm無(wú)法識(shí)別本地site-packages的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python使用FFMPEG壓縮視頻的方法

    Python使用FFMPEG壓縮視頻的方法

    FFMPEG是一個(gè)完整的,跨平臺(tái)的解決方案,記錄,轉(zhuǎn)換和流音頻和視頻,,這篇文章主要介紹了FFMPEG視頻壓縮與Python使用方法,需要的朋友可以參考下
    2023-09-09
  • Python面試之os.system()和os.popen()的區(qū)別詳析

    Python面試之os.system()和os.popen()的區(qū)別詳析

    Python調(diào)用Shell,有兩種方法:os.system(cmd)或os.popen(cmd)腳本執(zhí)行過(guò)程中的輸出內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于Python面試之os.system()和os.popen()區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-06-06

最新評(píng)論