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

 更新时间:2022年06月21日 09:57:01   作者:kingname  
这篇文章主要为大家介绍了如何利用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>标签下面只有一段文本,没有子标签,那么非常简单,如下图所示:

但现在的问题是,<p>标签下面有三段文本。每段文本之间还插入了其它的子标签。我们怎么样对每一段文本进行替换,但是又保持文本的相对顺序,并且还不能影响子标签?

p.text这种写法首先就可以排除了,因为它没有办法指定替换第几段文本。

你之所以会觉得这个问题很难解决,是因为你有一个错觉,请看上面这张截图,我打印了text_list。打印出来是一个包含字符串的列表。所以你可能会觉得。使用lxml写Xpath的时候,/text()返回的总是包含字符串的列表。

但实际上,返回的列表里面的元素并不是字符串,而是_ElementUnicodeResult对象。如下图所示:

不是字符串就简单了,那么我们可以获取每一个文本对象的父标签。然后修改父标签下面的文本就可以了。

看到这里,你肯定会问,这三个文本节点的父标签,不都是同一个<p>吗?如果你觉得是,那你就犯了想当然的错误。我们用代码来看看:

其实只有第一段文本的父标签是<p>。第二段文本的父标签,竟然是<p>的子标签<em>。第三段文本的父标签,是<span>

等等,如果第二段文本的父标签是<em>,那么<em>datetime</em>里面的datetime的父标签是什么?它的父标签也是<em>!那么问题来了,<em>text()文本节点,怎么可能又是datetime,又是<p>下面的第二段文本呢?

实际上,<em>text()始终都是datetime。如下图所示:

那么,<p>的第二段文本跟这个<em>标签是什么关系?实际上,这个关系叫做tail。如下图所示:

在一个标签里面,只有第一段text是它真正的text(),如果这个标签有子标签,那么位于子标签后面的文本,是这个子标签的tail。只不过当我们在正则表达式里面写/text()的时候,lxml会帮我们把所有子标签的tail都算作当前标签的text。

我们可以使用文本节点的.is_text.is_tail来判断它属于哪种文本。最终运行效果如下图所示:

以上就是利用Python实现翻译HTML中的文本字符串的详细内容,更多关于Python翻译HTML中字符串的资料请关注脚本之家其它相关文章!

相关文章

  • Python字符串的一些操作方法总结

    Python字符串的一些操作方法总结

    在本文里小编给大家整理了关于Python字符串的一些操作方法和相关要点总结,有需要的朋友们可以学习下。
    2019-06-06
  • Python安装Matplotlib包完整步骤记录

    Python安装Matplotlib包完整步骤记录

    这篇文章主要给大家介绍了关于Python安装Matplotlib包的相关资料,Matplotlib是一个Python 2D绘图库,它以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形,需要的朋友可以参考下
    2023-12-12
  • python的numpy模块安装不成功简单解决方法总结

    python的numpy模块安装不成功简单解决方法总结

    这篇文章主要介绍了python的numpy模块安装不成功简单解决方法总结,分享了四种python模块导入不成功的解决方法,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python csv模块使用方法代码实例

    Python csv模块使用方法代码实例

    这篇文章主要介绍了Python csv模块使用方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python多进程并发与同步机制超详细讲解

    Python多进程并发与同步机制超详细讲解

    进程(Process),顾名思义,就是进行中的程序。有一句话说得好:程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体。进程是资源分配的最小单元,也就是说每个进程都有其单独的内存空间
    2022-12-12
  • python实现将元祖转换成数组的方法

    python实现将元祖转换成数组的方法

    这篇文章主要介绍了python实现将元祖转换成数组的方法,涉及Python中list方法的使用技巧,需要的朋友可以参考下
    2015-05-05
  • Python使用循环神经网络解决文本分类问题的方法详解

    Python使用循环神经网络解决文本分类问题的方法详解

    这篇文章主要介绍了Python使用循环神经网络解决文本分类问题的方法,结合实例形式详细分析了Python神经网络相关概念、原理及解决文本分类具体操作技巧,需要的朋友可以参考下
    2020-01-01
  • 一文弄懂10大Pandas的索引

    一文弄懂10大Pandas的索引

    索引在我们的日常生活中其实是很常见的,本文主要介绍了一文弄懂10大Pandas的索引,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Python二叉搜索树与双向链表转换算法示例

    Python二叉搜索树与双向链表转换算法示例

    这篇文章主要介绍了Python二叉搜索树与双向链表转换算法,涉及Python二叉树构建、遍历及链表构造等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • python编写微信公众号首图思路详解

    python编写微信公众号首图思路详解

    这篇文章主要介绍了python编写微信公众号首图的思路,根据微信公众号首图要求,可以上传一个不超过5M的图片,且图片尺寸要是2.35:1的尺寸,具体实现思路及代码感兴趣的朋友跟随小编一起看看吧
    2019-12-12

最新评论