python 中文文本处理,python从html中提取文本

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: