91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用Python實現翻譯HTML中的文本字符串

發布時間:2022-06-21 13:56:06 來源:億速云 閱讀:201 作者:iii 欄目:開發技術

本篇內容主要講解“如何利用Python實現翻譯HTML中的文本字符串”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何利用Python實現翻譯HTML中的文本字符串”吧!

相信大家都用過瀏覽器的翻譯網頁功能,例如對于下圖這個英文網頁:

如何利用Python實現翻譯HTML中的文本字符串

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

如何利用Python實現翻譯HTML中的文本字符串

你可能會覺得這個功能很簡單,不就是字符串替換嗎?那你可以試一試把下面這個HTML片段中的<p>標簽下面的英文翻譯成中文。其它標簽中的不要改動:

<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>標簽中的datetime<span>標簽中的datetime.datetime.now()不需要翻譯。

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

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)
    ...

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

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

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

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

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

那有沒有辦法只對當前這一個<p>標簽里面的文本進行替換呢?關鍵的問題來了,你替換可以,但是怎么才能不影響這個<p>標簽下面的兩個子標簽?要保證文本和子標簽的相對位置不改變。

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

如何利用Python實現翻譯HTML中的文本字符串

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

如何利用Python實現翻譯HTML中的文本字符串

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

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

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

如何利用Python實現翻譯HTML中的文本字符串

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

看到這里,你肯定會問,這三個文本節點的父標簽,不都是同一個<p>嗎?如果你覺得是,那你就犯了想當然的錯誤。我們用代碼來看看:

如何利用Python實現翻譯HTML中的文本字符串

其實只有第一段文本的父標簽是<p>。第二段文本的父標簽,竟然是<p>的子標簽<em>。第三段文本的父標簽,是<span>

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

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

如何利用Python實現翻譯HTML中的文本字符串

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

如何利用Python實現翻譯HTML中的文本字符串

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

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

如何利用Python實現翻譯HTML中的文本字符串

到此,相信大家對“如何利用Python實現翻譯HTML中的文本字符串”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拉萨市| 泰兴市| 定西市| 张掖市| 丰原市| 崇明县| 石狮市| 大同县| 武功县| 莲花县| 泰来县| 扶风县| 金寨县| 广南县| 芜湖县| 水城县| 南宫市| 武冈市| 中宁县| 信宜市| 晋宁县| 日土县| 屏边| 山西省| 进贤县| 石首市| 浦北县| 理塘县| 北海市| 驻马店市| 平谷区| 阿拉善左旗| 舞阳县| 清流县| 河津市| 武乡县| 澄江县| 临泉县| 定州市| 丹江口市| 克什克腾旗|