请教一个div标签的过滤

新手入门、经验交流

Moderator: cre

Forum rules
  • 软件自带帮助是最好的入门教程,请仔细阅读;在您掌握最基本知识前,我们没法帮助您
  • 提问前请先查阅软件帮助文件和论坛相关讨论
  • 查阅软件帮助和论坛相关讨论即可解决的问题帖将直接删除,以免浪费他人时间
  • 请学会如何提问,尽量将问题描述清楚,不明确的提问将被直接删除
Post Reply
不夜侯
Posts: 101
Joined: Jul 29 2009, 16:22

请教一个div标签的过滤

Post by 不夜侯 »

规则如下:

Code: Select all

[Patterns]
Name = "Kill ad idclass"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8000
Match = "<(\w)\1[^>]++\s(id|class|name)\3=($AV($LST(Ad_idclass)))\2[^>]++>$INEST(<$TST(\1)*>,</$TST(\1)>)</$TST(\1)>|"
        "<(\w)\1[^><]++\s(id|class|name)\3=($AV($LST(Ad_idclass)))\2[^>]++>"
Replace = "<! ----- kill [\1 \3=\2] ----->"
想要过滤的网页:http://money.163.com/
目的是过滤这个标签:<div class="ggarea clearfix">
在Ad_idclass如果是直接这样添加:

Code: Select all

ggarea clearfix
则可以过滤。

如果添加过滤网页地址,写成:

Code: Select all

$URL(http://money.163.com/) ggarea clearfix
则过滤不成功。

反复测试都是如此。请问问题出在什么地方?谢谢!
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 请教一个div标签的过滤

Post by phoenix »

如果是在 prox 的 test window 中测试,prox 会假设当前 url 为:

Code: Select all

http://www.Shonen.Knife.com/Naoko/Michie/Atsuko/kappa.ex.cgi?jackalope
$URL(http://money.163.com/) 会导致测试失败,但如果你刷新网页,会看到实际过滤是成功的。
不夜侯
Posts: 101
Joined: Jul 29 2009, 16:22

Re: 请教一个div标签的过滤

Post by 不夜侯 »

实际刷新也是过滤不成功的。
进一步说明问题,这个标签内容如下,省略了一些具体内容用.............代替:

Code: Select all

<div class="ggarea clearfix">
<span class="blank9"></span>
<ul class="ggtext">
.............
    <span class="blank9"></span>
    <ul class="ggimg">
    	<li class="gg125">
        .....................
        <li class="gg660">
        .........................
        </li>
        <li class="gg125">
        ...........................
        </li>
    </ul>
    <span class="blank6"></span>
	<!-- 通栏上文字 -->
<ul class="ggtext">
..........................
</ul>
    <span class="blank9"></span>
</div>
1、在Ad_idclass如果是这样添加,则过滤成功。

Code: Select all

ggarea clearfix
gg(sidebox|hzh|top|[0-9]+)
ggtext
2、在Ad_idclass如果是这样添加,则过滤不成功。只过滤了<ul class="ggtext">、<li class="gg125">等,没过滤<div class="ggarea clearfix">。

Code: Select all

gg(sidebox|hzh|top|[0-9]+)
ggtext
$URL(http://money.163.com/) ggarea clearfix
3、在Ad_idclass如果是这样添加,删除gg(sidebox|hzh|top|[0-9]+)、ggtext,则也过滤成功。

Code: Select all

$URL(http://money.163.com/) ggarea clearfix
以前也遇到过类似问题。弄不明白第二种情况有什么冲突的地方?
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 请教一个div标签的过滤

Post by phoenix »

不夜侯 wrote:实际刷新也是过滤不成功的。
你首帖的例子,也就是你上面说的第三种情况,我实际测试过,过滤是成功的。你上面也提到是成功的。
不夜侯 wrote: 2、在Ad_idclass如果是这样添加,则过滤不成功。只过滤了<ul class="ggtext">、<li class="gg125">等,没过滤<div class="ggarea clearfix">。

Code: Select all

gg(sidebox|hzh|top|[0-9]+)
ggtext
$URL(http://money.163.com/) ggarea clearfix
这是因为 gg(sidebox|hzh|top|[0-9]+) 中的 gg[0-9]+ 匹配了 <div class="ggarea clearfix"> 中的 gg

一旦 proxomitron 在 blockfile 中发现一个匹配,它就会退出检索这个 blockfile ,所以下面的 ggtextggarea 都不会再被尝试了。

退出 blockfile 后, Match 表达式中的下一个字符应该是 $AV() 中的 " ,而实际文本中是 <div class="ggarea clearfix"> 中的 a ,匹配失败,注意我前面说过 proxomitron 不会再回到 blockfile 中检索其他的可能性,而是从实际文本中的下一个字符开始重新尝试 Match 表达式,最终匹配了 <li class="gg125"><li class="gg660"> 等等。

综上所述,在 blockfile 中添加项目应该注意唯一性,避免一个项目中的部分表达式被另一个项目包含。本例中 ggtextggarea clearfix 中的 gg 部分就被 gg(sidebox|hzh|top|[0-9]+) 中的 gg[0-9]+ 包含了。为了避免这种情况,可以写成:

Code: Select all

gg(sidebox|hzh|top|[0-9]+{1,*})
不夜侯
Posts: 101
Joined: Jul 29 2009, 16:22

Re: 请教一个div标签的过滤

Post by 不夜侯 »

谢谢phoenix,按照你的写法避免了匹配失败。
还有几个地方不明白。
1、
这是因为 gg(sidebox|hzh|top|[0-9]+) 中的 gg[0-9]+ 匹配了 <div class="ggarea clearfix"> 中的 gg 。
gg[0-9]+中的[0-9]+,应该至少匹配一个数字吧?
2、
如果这样写过滤成功:

Code: Select all

ggarea clearfix
gg(sidebox|hzh|top|[0-9]+)
ggtext
如果其中一个指定URL,就过滤失败:

Code: Select all

gg(sidebox|hzh|top|[0-9]+)
ggtext
$URL(http://money.163.com/) ggarea clearfix
这个地方就有不明白,proxomitron 在 blockfile 中是不是有优先级别?先检索没有指定URL的规则,然后再检索指定URL的规则。
不指定URL的所有规则优先级别是平等的,检索时匹配最接近的规则过滤。如果匹配就不再检索指定URL的规则,如果不匹配就继续检索指定URL的规则。
要不就难以解释我上面所说的情况。
3、
再举一个例子,http://www.tianya.cn/publicforum/articl ... free.shtml中有个标签:
<div id="adsp_list_top_banner" style="height:82px;"></div>
在 blockfile 中如果是以下就过滤成功:

Code: Select all

ad
adsp_list_top_banner
如果指定URL,就过滤失败:

Code: Select all

ad
$URL(http://*.tianya.cn/) adsp_list_top_banner
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 请教一个div标签的过滤

Post by phoenix »

不夜侯 wrote: gg[0-9]+中的[0-9]+,应该至少匹配一个数字吧?
如果[0-9]+能至少匹配一个数字,我为什么要加{1,*}?自己在test window里验证一下吧。
不夜侯 wrote: proxomitron 在 blockfile 中是不是有优先级别?先检索没有指定URL的规则,然后再检索指定URL的规则。
是否如此,你把指定URL的项目提到第一行试下便知。

为什么你指定URL后连项目排序也变了?这样引入了两个变量,出现问题后很难知道是哪个变量引起的。
不夜侯 wrote: 再举一个例子,http://www.tianya.cn/publicforum/articl ... free.shtml中有个标签:
<div id="adsp_list_top_banner" style="height:82px;"></div>
在 blockfile 中如果是以下就过滤成功:

Code: Select all

ad
adsp_list_top_banner
如果指定URL,就过滤失败:

Code: Select all

ad
$URL(http://*.tianya.cn/) adsp_list_top_banner
很抱歉,如果blockfile中只有那两项,不管指定不指定URL,我测试下来都是失败的。为什么失败?我上一个回帖已经解释过了,也给出了解决方法,如果看不懂,麻烦多读几遍,自己多测试几遍。

另外,我直接给你个结论吧,这个问题和指定URL与否没有任何关系。
Bonnie
Moderator
Posts: 165
Joined: Oct 05 2008, 01:27

Re: 请教一个div标签的过滤

Post by Bonnie »

有点疑问,[0-9]+不就是匹配一个或一个以上的数字吗?为什么要加上{1,*}?
我试了下,gg[0-9]+可以匹配gg1这样的数字啊。
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 请教一个div标签的过滤

Post by phoenix »

是零或以上。我原来的回帖说得很明白了啊。
phoenix wrote: 这是因为 gg(sidebox|hzh|top|[0-9]+) 中的 gg[0-9]+ 匹配了 <div class="ggarea clearfix"> 中的 gg
gg[0-9]+固然可以匹配gg1,也可以匹配gg,你自己测试一下。
不夜侯
Posts: 101
Joined: Jul 29 2009, 16:22

Re: 请教一个div标签的过滤

Post by 不夜侯 »

我测试过了,[0-9]+ 是匹配零或以上位数的数字。
这地方犯了个错误,以为 [0-9] 表示任意单个的数字,所以想当然 [0-9]+ 至少是匹配一个或一个以上的数字。
如果是 gg[0-9] 反而不匹配 gg 。

在 blockfile 中的项目排序也很重要,以往我将指定URL的放在最后面,以为方便管理,却不知这样会造成一些过滤失败。
像ad、adsp_list_top_banner,先后秩序应该是:

Code: Select all

adsp_list_top_banner
ad
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 请教一个div标签的过滤

Post by phoenix »

不夜侯 wrote: 在 blockfile 中的项目排序也很重要,以往我将指定URL的放在最后面,以为方便管理,却不知这样会造成一些过滤失败。
像ad、adsp_list_top_banner,先后秩序应该是:

Code: Select all

adsp_list_top_banner
ad
你这样排序还是有问题的。
如果 blockfile 中 没加 NoHash 关键字,那么Hash后的顺序是无法预料的。最稳妥的办法还是我前面说的保持条目的唯一性,避免部分包含。

当然,你可以加 NoHash 关键字来控制排序,不过会牺牲些性能。
Post Reply