GNE 预处理技术——如何移除特定标签但是保留文字到父标签

简介: GNE 预处理技术——如何移除特定标签但是保留文字到父标签

摄影:产品经理

厨师:kingname


在开发新闻网页正文通用抽取器 GNE的过程中,需要对目标网页的源代码进行一些预处理,从而提高正文抓取的准确性。其中之一就是把 <p>标签内部的 <span>标签中的文本,合并到 <p>标签中,再删除 <span> 标签。

例如:

<html>
    <head>
        <title>演示合并节点</title>
    </head>
    <body>
        <div>
            <p>你好,<span>世界;</span>你好,<span>产品经理</span></p>
        </div>
    </body>
</html>

需要转换为:

<html>
    <head>
        <title>演示合并节点</title>
    </head>
    <body>
        <div>
            <p>你好,世界;你好,产品经理</p>
        </div>
    </body>
</html>

在原来做定向爬虫的时候,这本不是什么问题,因为使用 XPath 可以直接提取所有内容:

  1. 运行效果如下图所示:
1. from lxml.html import fromstring
2. selector = fromstring(html)
3. text = ''.join(selector.xpath('//p//text()'))
4. print(text)

但在通用新闻抽取器里面不能这样写。因为并不是所有的 <p>标签中的内容都是新闻正文。GNE 有一套算法来计算并寻找全部包含真正有效内容的 <p>标签。这就要求在预处理阶段,需要把 <p>标签里面的 <span>标签合并到 <p>标签里面。

可能有人的第一反应是:先把 <p> 标签里面的内容提取出来,然后再把 <span> 标签里面的内容提取出来,并添加到 <p> 标签中。这不就解决问题了吗?

但实际上并没有这么简单。以上面的 HTML 代码为了,如果按照这种简单的解法,那么分别提取以后会得到如下内容:

现在问题来了,你怎么知道 <span> 标签中提取出来的这两个字符串 世界, 产品经理,分别应该插入到 <p> 标签结果列表中的哪个位置?所以这种方案并不可取。

那么又有人问,能不能使用 XPath 的 string关键字把 <p> 标签下面的所有文本直接提取出来,再作处理呢?这样不就可以忽略标签差异了吗?在上面的 html 代码中,这种方案是可行的:

但是,这种方案不能应用到 GNE 中。这是由于这种做法,会无差别移除所有的标签。但是 <p> 标签下面的 <a>标签是有用的,它在用于过滤导航栏或者推荐新闻这种类型的干扰内容中会起到很大的作用。所以 <a>标签必需保留。

那么,本文标题提到的问题:

如何移除指定标签,但是保留它的文本,合并到父标签中?


应该如何解决呢?

实际上,这个问题在 lxml 中有现成的办法解决,他就是 etree.strip_tags

使用方法如下:

from lxml.html import etree
etree.strip_tags(element, '标签1', '标签2', '标签3')

在本文的例子中,解决方案如下:

from lxml.html import fromstring, etree
selector = fromstring(html)
p_tag_list = selector.xpath('//p')
for p_tag in p_tag_list:
    etree.strip_tags(p_tag, 'span')
text = ''.join(selector.xpath('//p/text()'))
print(text)

运行效果如下图所示:

需要注意的是, etree.strip_tags()会直接修改原始Dom 树,不需要返回修改结果。

目录
相关文章
|
2月前
|
前端开发 JavaScript
基础标签应用
基础标签应用
14 2
|
4月前
|
JSON 定位技术 数据格式
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)(下)
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)
33 0
|
5月前
|
前端开发
HTML图片音频视频标签、超链接标签、列表标签和布局标签示例
HTML图片音频视频标签、超链接标签、列表标签和布局标签示例
48 0
|
8月前
|
存储 前端开发 API
标签(1)(详解)
标签(1)(详解)
|
10月前
Echarts参数属性学习:x轴标签文本过长自动缩减并替换成缩略号...
Echarts参数属性学习:x轴标签文本过长自动缩减并替换成缩略号...
80 0
|
JavaScript 前端开发 双11
清除前端标签中(输入框)的内容
清除前端标签中(输入框)的内容
97 0
数据集的文字标签(label)转成数字标签
数据集的文字标签(label)转成数字标签
数据集的文字标签(label)转成数字标签
|
图计算 开发者
打标签_生成标签| 学习笔记
快速学习打标签_生成标签
74 0
打标签_生成标签| 学习笔记
|
移动开发 Python
批量查找文本中的内容
@echo off findstr /ims "查找内容" *.*>list.txtps:把含有相关文字内容的文档输出到list.txt文本中,适用于能用notepad打开的各种文档.   是一个修改升级的版本,原程序是这个《批量查找替换文本文件内容》。
1024 0