利用Python实现翻译HTML中的文本字符串


Posted in Python onJune 21, 2022

相信大家都用过浏览器的翻译网页功能,例如对于下图这个英文网页:

利用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中的文本字符串的详细内容,更多关于Python翻译HTML中字符串的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python赋值操作方法分享
Mar 23 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
Oct 15 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
Python socket套接字实现C/S模式远程命令执行功能案例
Jul 06 Python
python实现顺时针打印矩阵
Mar 02 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
python中的列表与元组的使用
Aug 08 Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 Python
python使用多线程查询数据库的实现示例
Aug 17 Python
Python词云的正确实现方法实例
May 08 Python
python 如何做一个识别率百分百的OCR
May 29 Python
使用scrapy实现增量式爬取方式
Jun 21 #Python
python+opencv实现目标跟踪过程
Jun 21 #Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Python+DeOldify实现老照片上色功能
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 #Python
virtualenv隔离Python环境的问题解析
Jun 21 #Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 #Python
You might like
php SQL之where语句生成器
2009/03/24 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
基于python使用tibco ems代码实例
2019/12/20 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
面料业务员岗位职责
2013/12/26 职场文书
大专毕业生求职信
2014/07/05 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书