利用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 matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
Python中的浮点数原理与运算分析
Oct 12 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 Python
Python实战购物车项目的实现参考
Feb 20 Python
python处理document文档保留原样式
Sep 23 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
python自动生成sql语句的脚本
Feb 24 Python
python实现简易自习室座位预约系统
Jun 30 Python
Python学习之包与模块详解
Mar 19 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 06 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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 获取完整url地址
2008/12/20 PHP
PHP用mysql数据库存储session的代码
2010/03/05 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
Python 连连看连接算法
2008/11/22 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
Python中装饰器学习总结
2018/02/10 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
出纳工作岗位责任制
2014/02/02 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
礼貌问候语大全
2015/11/10 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
nginx实现动静分离的方法示例
2021/11/07 Servers
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
APP界面设计技巧和注意事项
2022/04/29 杂记