成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:使用Python翻譯HTML中的文本字符串

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

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

圖片

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

圖片

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

<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)有了一個現(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)該會愣一下。因為你突然發(fā)現(xiàn)一個問題,怎么把中文替換回去?

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

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

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

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

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

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

圖片

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

圖片

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

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

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

圖片

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

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

圖片

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

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

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

圖片

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

圖片

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

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

? 圖片 ?

責(zé)任編輯:武曉燕 來源: 未聞Code
相關(guān)推薦

2022-11-06 21:04:49

字符串字段參數(shù)

2021-10-20 20:02:47

字符變量函數(shù)

2024-05-29 00:00:01

字符串Python縮進

2025-06-13 01:15:00

正則表達式大模型

2021-07-27 21:32:57

Python 延遲調(diào)用

2022-03-12 20:38:14

網(wǎng)頁Python測試

2022-05-02 16:27:01

JavaScriptHTMLPython

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監(jiān)控

2021-05-08 19:33:51

移除字符零寬

2021-04-12 21:19:01

PythonMakefile項目

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2021-09-13 20:38:47

Python鏈?zhǔn)?/a>調(diào)用

2021-03-12 21:19:15

Python鏈?zhǔn)?/a>調(diào)用

2024-07-30 08:16:18

Python代碼工具

2024-07-30 08:11:16

2021-10-15 21:08:31

PandasExcel對象

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2020-12-11 06:30:00

工具分組DataFrame

2021-11-12 05:00:43

裝飾器代碼功能
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 黄色网址大全在线观看 | 亚洲欧美一区二区三区在线 | 国产一区二区三区 | 欲色av| 久久精品国产免费高清 | 日韩中文字幕免费 | 中文字幕日韩欧美一区二区三区 | 九九99久久 | 久久性 | 一区二区三区视频 | 欧美人妇做爰xxxⅹ性高电影 | 日韩高清国产一区在线 | 午夜在线视频一区二区三区 | 天堂一区二区三区 | 日本成人在线网址 | 青青草原精品99久久精品66 | 日本不卡免费新一二三区 | 日本一区视频在线观看 | 在线观看av网站永久 | 精品视频一区二区三区 | 久久88| 日本一区二区在线视频 | 日本成人福利视频 | 国产精品毛片一区二区三区 | 精品欧美乱码久久久久久1区2区 | 欧美一卡二卡在线 | 亚洲毛片在线观看 | 久久综合国产精品 | 狠狠操婷婷 | 日韩一区二区三区精品 | 一级免费看 | 欧美日本一区二区 | 欧美在线一区二区三区 | 中文成人无字幕乱码精品 | 国产精品99一区二区 | 久久久久久久久99精品 | 免费一区 | 成人免费观看视频 | 亚洲视频在线观看 | 欧美色综合一区二区三区 | 国产精产国品一二三产区视频 |