其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

正则过滤html中的第一个p标签 火车头采集常用的纯正则过滤

GG网络技术分享 2025-03-18 16:14 4


正则过滤html中的第一个p标签

问:应该怎么用正则过滤掉第一对p标签以及里面的内容

<div class="content">

                        <p class="sherry_labels" style="margin:0 ;"> 

                        <a href="http://zj.admin5.com/" target="_blank">中介交易</a> <a href="http://seo.admin5.com/seozhenduan/" target="_blank">SEO诊断</a><a href="http://www.admin5.net/forum-494-1.html" title="淘宝客" target="_blank">淘宝客</a> <a href="http://www.etuan.com/" target="_blank">站长团购</a> <a href="http://yun.admin5.com/" title="云主机" target="_blank">云主机</a> <a href="http://v.admin5.com/" title="A5外包" target="_blank">A5外包</a>

                         </p>

<p>222</p><p>333</p><p>444</p>

</div>

1 个解决方案

#1


$s =<<< TXT

<div class="content">

                        <p class="sherry_labels" style="margin:0 ;"> 

                        <a href="http://zj.admin5.com/" target="_blank">中介交易</a> <a href="http://seo.admin5.com/seozhenduan/" target="_blank">SEO诊断</a><a href="http://www.admin5.net/forum-494-1.html" title="淘宝客" target="_blank">淘宝客</a> <a href="http://www.etuan.com/" target="_blank">站长团购</a> <a href="http://yun.admin5.com/" title="云主机" target="_blank">云主机</a> <a href="http://v.admin5.com/" title="A5外包" target="_blank">A5外包</a>

                         </p>

<p>222</p><p>333</p><p>444</p>

</div>

TXT;

echo preg_replace('#<pb.+/p>#isU', '', $s, 1);

<div class="content">

                        

<p>222</p><p>333</p><p>444</p>

</div>

MySql通配符过滤,正则表达式过滤

百分号通配符:在搜索串中,%表示任意字符出现的任何次数。

1:找出所有以jet开头的产品

SELECT prod_name,prod_price from products WHERE prod_name like'jet%'。

2:匹配任何位置包含文本anvil的值

SELECT prod_name,prod_price from products WHERE prod_name like'%anvil%'

注意:%可以匹配0个字符,但不能匹配null值.

下划线通配符:下划线只匹配单个字符而不是多个字符。

1:SELECT prod_name,prod_price from products WHERE prod_name like'_ ton anvil%'

通配符使用技巧:1、不要过度使用通配符,如果使用其他操作符能达到相同的目的,应该使用其他操作符;

2、在确实使用通配符时,最好不要把它们置于搜索模式的开始处.那样是最慢的.

正则表达式:1:检索列prod_name中包含文本1000的所有行

SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '1000'ORDER BY prod_name;

2:检索列prod_name中包含文本000的所有行

prod_name,prod_price from products WHERE prod_nameREGEXP '.000'ORDER BY prod_name;

上面正则表达式中的“.”表示匹配任意一个字符。

3:检索列prod_name中包含文本1000或2000的所有行

SELECT prod_name,prod_price from products WHERE prod_name REGEXP '1000|2000'ORDER BY prod_name;

4:匹配几个字符之一

SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '[1-3] ton' ORDER BY prod_name;

[1-3]意思为“1|2|3”  如图

匹配特殊字符

SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '\.'ORDER BY prod_name;

上面为了匹配特殊字符,需要使用\为前导(转义)  为了匹配“”,需要使用“\”

5:   匹配字符类

SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '[:upper:]' ORDER BY prod_name;

REGEXP '[:upper:]' 表示匹配任意大写字母。还有其它字符类如下:

6:匹配多个实例

重复元字符

 

SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '\([0-9] sticks?\)'ORDER BY prod_name;

解释一下:第一个\转义“(”   用 [0-9]表示匹配任意数字,sticks?表示匹配stick 或者sticks ,"?"使得sticks后的s变为可选值. ?表示它前面的字符出现0次或者1次。                                                最后一个\转义")"

输出为:

7:SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '[[:digit:]]{4}'ORDER BY prod_name;

REGEXP '[[:digit:]]{4}'匹配连在一起的任意4位数字.

8:定位符

^有两种用法,在集合中(用“[”和“]”)定义,用它来否定该集合,否则,用来指串的开始处.

SELECT prod_name,prod_price from products WHERE prod_nameREGEXP '^[0-9\.]'ORDER BY prod_name;

找出以任意数字为串中第一个字符时的匹配;

 

正则表达式与like的区别:like匹配整个串,而regexp匹配子串.利用定位符,用"^"开始,"$"结尾,可以使regexp与like的作用一样.

 

火车头采集常用的纯正则过滤

为了得到一个标准的内容,在采集上必须下足功夫才行!编写好采集规则。

每一个段落都是<p></p>

没有多余的HTML标签和与主题无关的字符

提取数据方式

选择 正则提取,组合结果填 <p>[参数1]</p>

有些内容开始和结尾并没有p标签,换行是用br标签来完成,所以我们要创造p标签

数据处理

第一步:清除与正文无关的内容,如文中的广告,注释等

正则 <header>[sS]*?</header>|<!--.*?-->| |规则4|规则5 替换为 空

如果发布到一些免费平台,有的HTML特殊字符并不会被转化,只需在末尾加入'|&.*?;'过滤掉最后特殊HTML字符即可。

第二步:只保留图片以及常用的块级元素

正则 (?i)<(?!/?h|/?p|/?div|br|img).*?> 替换为 空

只保留标题标签 h 分段标签 p、div、br 以及图像标签 img ;前面的(?i)表示不区分大小写

第三步:去掉除了img标签外的所有标签的选择器或样式,并把标签修改为p

正则 <(?!img)(/?)w+.*?> 替换为 <$1p>

第四步:把乱七八糟的图像样式,改成标准图像代码

正则 <img.*?src="(.+?)".*?> 替换为 <img src="$1">

第五步:规范段落标签<p>开始</p>结束

正则 </?p>替换为</p><p>

慧聪网段落只有<p>开始没有</p>结束

某些站个别文章,</p>结束后没有<p>开始就直接是下个段落的内容

第六步:把<p>或</p>前后的空格替换为空

正则 s*(</?p>)s* 替换为 $1

第七步:把连续2个以上的<p>或</p>替换为1个

正则 (<p>){2,}|(</p>){2,} 替换为 $1$2

第八步:把所有的空段落替换为空

内容 <p></p> 替换为 空

第九步:由于第五步的关系,文章开头可能是</p>结尾可能是<p>需要清理他们

正则 ^</p>|<p>$ 替换为 空

过滤英文正则  [a-zA-Z]

正则过滤两位以上的数字(d{2,100})

利用正则表达式过滤特殊字符

过滤正则表达式,只保留中文、英文、数字及一些标点符号.

str = "123,456" # 要过滤的字符串

re_exp = u"([^u4e00-u9fa5u0030-u0039u0041-u005au0061-u007a’!"#$%&'()*+,-./:;<=>?@,。?、…【】《》?“”‘’!["u"\]^_`{|}~s])" # 过滤正则表达式,只保留中文、英文、数字及一些标点符号

re_exp_2 = u"([.*[d+].*])" # 过滤形如[1]等的引用

result_str = re.sub(re_exp, "", str)

print(result_str)

正则匹配所有url

(((http|ftp|https)://)?)([a-zA-Z0-9.-])(:[0-9]{1,4})/[a-zA-Z0-9&%./-~-]*

提取HTML中所有图片地址的正则表达式

# 正则表达式

<img[sS]+?src=['"](.+?)['"][sS>]?>

正则表达式之匹配中文

w 匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下

匹配中文字符的正则表达式: [u4e00-u9fa5]

或许你也需要匹配双字节字符,中文也是双字节的字符

匹配双字节字符(包括汉字在内)[^x00-xff]

 

 

 

标签:

提交需求或反馈

Demand feedback