python过滤替换a标签的2个方法

来源:网络 文章列表 2019-07-01 8
当我们采集了某篇文章后,可能需要将文章里的内部a标签链接去除或者将内链/外链替换为自己的链接地址,那么这个时候我们可以怎么做呢

当我们采集了某篇文章后,可能需要将文章里的内部a标签链接去除或者将内链/外链替换为自己的链接地址,那么这个时候我们可以怎么做呢

假如我们有如下html

s = """
<div class="article-bar-top"><a class="follow-nickName" href="http://wwww.jsphp.net/" target="_blank">三尺秋水一点飞鸿</a><span class="read-count">阅读数 913</span></div>
<div class="article-bar-top"><a class="follow-nickName" href='http://wwww.jsphp.net/' target="_blank">三尺秋水一点飞鸿222</a><span class="read-count">阅读数 913</span></div>
"""

 

方法一

首先想到的当然是re正则

我们需要去掉a标签

import re
c = re.compile('<a (.*?) href=("|\')(.*?)("|\')>(.*?)</a>')
ret = c.sub(' ', s) #将a标签替换为空
print(ret)
 

执行结果为:

<div class="article-bar-top"> <span class="read-count">阅读数 913</span></div>
<div class="article-bar-top"> <span class="read-count">阅读数 913</span></div>

这里我们还可以指定替换的次数,比如我只替换一次

import re
s = """
<div class="article-bar-top"><a class="follow-nickName" href="http://wwww.jsphp.net/" target="_blank">三尺秋水一点飞鸿</a><span class="read-count">阅读数 913</span></div>
<div class="article-bar-top"><a class="follow-nickName" href='http://wwww.jsphp.net/' target="_blank">三尺秋水一点飞鸿222</a><span class="read-count">阅读数 913</span></div>
"""
c = re.compile('<a (.*?) href=("|\')(.*?)("|\')>(.*?)</a>')
ret = c.sub(' ', s, 1) #只替换一次
print(ret)

<div class="article-bar-top"> <span class="read-count">阅读数 913</span></div>
<div class="article-bar-top"><a class="follow-nickName" href='http://wwww.jsphp.net/' target="_blank">三尺秋水一点飞鸿222</a><span class="read-count">阅读数 913</span></div>

 

方法二:使用w3lib

w3lib是一个Python包,实现了一下与web相关的功能:

    从html片段中移除注释或者标签
    从html片段中提取base url
    对html串中的字符实体进行转义
    将原始HTTP头转换为字典格式
    构造HTTP的认证报头
    将html页面转换成unicode编码格式
    从urls中提取参数

w3lib主要包括四个模块:

    html模块:处理与html标签相关的问题
    http模块:处理与http报文相关的问题
    url模块:处理与url地址相关的问题
    encoding模块:处理与编码格式相关的问题

我们主要用到的就是html模块

html模块包括4个函数

html.remove_tags()
html.remove_tags_with_content()
html.remove_comments()
html.remove_entities()

 

remove_tags(text, which_ones=(), keep=(), encoding=None)

作用:去除或保留标签,但是仅仅是去除标签,正文部分是不做处理的

remove_tags接收四个参数

看其函数具有四个变量,

第一个是文本,即你需要传入的网页源码,必须是字符串

第二个是你要去除掉的标签,需要传入的参数类型是元组,原理是根据正则匹配去除的

第三个是你要保留的标签,需要传入的参数类型依旧是元组

第四个是编码

看备注我们可以得知,第二第三个参数总共有四种状态

which_ones keep what it does
非空 去除掉所有 which_ones里面的标签
非空 只保留keep里的标签
去除所有的标签
非空 非空 不允许的情况

代码示例:

以下的代码以example.com的部分源码进行测试

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
from w3lib import html
import requests
from lxml import etree

res = requests.get("http://www.example.com/")
response = etree.HTML(res.content)
temp = response.xpath('//body') # 返回值为一个列表
doc = etree.tostring(temp[0])   # 将定位到的元素转成str,即获得源码

# 以上代码只是为了获取body的源码,与函数演示无关

result = html.remove_tags(doc) # 标签全部去除
print(result)

只留下正文部分

调整代码,让p标签与a标签还留着

result = html.remove_tags(doc,which_ones = ('body','h1','div'))

 

remove_tags_with_content(text, which_ones=(), encoding=None)

作用:去除标签,包括其正文部分

参数变成了三个,与上面的用法一致,只是少了一个keep参数,无法保留,只能去除

 

remove_comments

作用:去除掉网页的注释

参数只有两个,一个是text(网页源码),str类型,一个是编码(encoding)

from w3lib.html import remove_comments
remove_comments(b"test <!--textcoment--> whatever")

结果即test whatever

 

remove_entities(text, keep=(), remove_illegal=True, encoding='utf-8')

作用:将网页中的一些特殊字符的源码显示改变成正常显示(个人理解)

官方解释是通过将实体转换为相应的unicode字符,从给定的text中删除实体。

在函数源码中已声明,该函数即将被剔除,将被replace_entities取代

函数具有三个参数,第一个是源码(字符串),第二个是你需要保留不变的实体(元组),第三个是是否删除无法转换的实体(true删除,false不删除),第四个是编码,默认utf-8

from w3lib.html import replace_entities
print(replace_entities(b'Price: &pound;100'))

以下为结果

Price: £100

腾讯云限量秒杀

1核2G 5M 50元/年 2核4G 8M 74元/年 4核8G 5M 818元/年 CDN流量包 100GB 9元

版权声明

本站部分原创文章,部分文章整理自网络。如有转载的文章侵犯了您的版权,请联系站长删除处理。如果您有优质文章,欢迎发稿给我们!联系站长:
愿本站的内容能为您的学习、工作带来绵薄之力。

评论

  • 随机获取
点击刷新
精彩评论

友情链接