利用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贪吃蛇游戏编写代码
Oct 26 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
Python中按键来获取指定的值
Mar 02 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
Django中使用session保持用户登陆连接的例子
Aug 06 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
python matplotlib拟合直线的实现
Nov 19 Python
python绘制规则网络图形实例
Dec 09 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python os模块在系统管理中的应用
Jun 22 Python
python生成xml时规定dtd实例方法
Sep 21 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根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
php实现微信模板消息推送
2018/03/30 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
Python画图学习入门教程
2016/07/01 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python实现飞机大战游戏
2020/10/26 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
幼儿园教师的考核评语
2014/04/18 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
维稳工作承诺书
2015/01/20 职场文书
教学质量月活动总结
2015/05/11 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
运动会5000米加油稿
2015/07/21 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL