python 中文文本处理,python从html中提取文本
本文主要介绍如何使用Python实现翻译HTML中文本字符串的功能。文章中的样例代码解释的很详细,有兴趣的朋友可以去试试。
相信大家都用过浏览器翻译网页的功能,比如下图的英文网页:
一键翻译成中文后,看起来是这样的:
你可能觉得这个函数很简单,不就是字符串替换吗?然后你可以试着把下面HTML片段中P标签下的英文翻译成中文。不要更改其他标签:
差异
pifyouwanttoparsedateandtime,yourculuseemdatetime/em,byusethislibrary,youchangeneratenowtimebyonelinecodespandadatetime . datetime . now()/spansthissoeasy。/p
/div
em标记中的Datetime和span标记中的datetime.datetime.now()不需要翻译。
你一拍脑袋,马上就写了下面几行代码(假设你已经有现成的translate()函数,传入英文,中文输出):
fromlxml.htmlimportfromstring
源= 分区
pifyouwanttoparsedateandtime,yourculuseemdatetime/em,byusethislibrary,youchangeneratenowtimebyonelinecodespandadatetime . datetime . now()/spansthissoeasy。/p
/div
选择器=fromstring(源)
text _ list=selector . XPath(//p/text())
fortextintext_list:
中文=翻译(文本)
.
写到这里,你应该惊呆了。因为你突然发现一个问题,怎么替换中文?
不用尝试去百度了。在今天(2022-06-20)之前,整个中文网络里面,你找不到解决方法。
一个比较笨的办法就是直接用文本替换原来的HTML字符串:
fortextintext_list:
中文=翻译(文本)
source=source.replace(文本,中文)
但这样做,效率很低。因为你必须不断扫描整个HTML字符串。一般一个中型网站的HTML有几千行,10万到20万个字符。每翻译一小段,就把整篇课文换掉,这样会花很长时间。
有没有办法只替换当前P标签中的文本?关键问题来了。可以替换,但是怎么能不影响这个P标签下面的两个子标签呢?确保文本和子标签的相对位置不会改变。
如果p标签下只有一段文字,没有子标签,那就很简单了,如下图所示:
但现在的问题是,P标签下有三段文字。其他子标签被插入到文本的每个段落之间。如何替换每段文字,但保持文字的相对顺序,不影响子标签?
p.text的写法首先可以排除,因为它没有办法指定要替换哪一段文字。
你之所以觉得这个问题很难解决,是因为你产生了错觉。请看上面的截图。我打印了文本列表。打印出字符串列表。所以你可能会想。用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中字符串的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。