首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex:匹配重复的未知组?

Regex:匹配重复的未知组?
EN

Stack Overflow用户
提问于 2015-09-28 11:15:38
回答 2查看 517关注 0票数 1

我试图为爬虫创建一个通用的regex模式,以避免所谓的“爬虫陷阱”(只添加url参数并引用相同页面的链接,这会导致大量无用的数据)。很多时候,这些链接只是一次又一次地将相同的部分添加到URL中。下面是一个日志文件的示例:

代码语言:javascript
复制
http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/...

我可以使用正则表达式缩小爬虫的范围,并且我希望有一个模式,它告诉爬虫忽略所有有重复部分的内容。用正则表达式可以吗?谢谢你提前给我一些提示!

我只想澄清:

爬虫陷阱的设计并不是为了防止爬行,而是由于网页设计不佳。我们正在爬行的所有页面都明确地允许我们这样做!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-28 11:24:04

如果您已经在遍历URL列表,则可以添加匹配作为跳过当前迭代的条件:

代码语言:javascript
复制
array = ["/abcd/abcd/abcd/abcd/", "http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/", "http://examplepage/apple/cake/banana/"]

import re
pattern1 = re.compile(r'.*?([^\/\&?]{4,})(?:[\/\&\?])(.*?\1){3,}.*')

for url in array:
    if re.match(pattern1, url):
        print "It matches; skipping this URL"
        continue 
    print url 

示例regex:

.*?([^\/\&?]{4,})(?:[\/\&\?])(.*?\1){3,}.*

([^\/\&?]{4,})匹配和捕获任何东西的序列,但不包含/&?,重复4次或更多次。(?:[\/\&\?])查找一个/,或者?(.*?(?:[\/\&\?])\1){3,}匹配任何东西,直到/&?,然后是我们捕获的内容,完成所有这3次或更多次。演示

票数 2
EN

Stack Overflow用户

发布于 2015-09-28 11:31:19

您可以使用Python/PERL (可能还有其他)中的反向引用来捕获重复的模式:

代码语言:javascript
复制
>>> re.search(r"(/.+)\1", "http://examplepage.com/cssms/chrome/cssms/chrome/cssms/pages/browse/cssms/pages/misc/").group(1)
'/cssms/chrome'

\1引用第一个匹配,因此(/.+)\1意味着同一序列在一行中重复两次。前面的/只是为了避免与第一个重复字母(即http中的t )匹配的正则表达式,并在路径中捕获重复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32821640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档