【问题标题】:Regular expression to filter URLs that have more than one ampersand "&"用于过滤具有多个与号“&”的 URL 的正则表达式
【发布时间】:2014-06-02 19:28:45
【问题描述】:

我正在使用一个网络爬虫(称为 Nutch),当我向其中输入一堆网址时,它会爬取网络。我设置了某些正则表达式过滤器来控制爬虫到特定域和特定过滤器。

# skip URLs containing a back slash

-[\\]    

# skip URLS containing more than 6 levels

-^http://([a-zA-Z.-]+)/(?:[^/]+/){6,}.*$

# crawl only domain abc

+^http://www.abc.xx.yyy.zzz/pubs/([a-z]+)

问题:在特定域中,我的爬虫正在使用我不想要的所有分页和查询参数来爬取所有搜索表单 url。例如:

http://www.abc.xx.yyy.zzz/pubs/biblio_results.asp?Library=ABC&SubjectScope=keyword&SubjectMode=contains&SubjectText=abc_archive&URLs=yes&Order=year&SortOrder=DESC&Abstracts=no

我不确定如何设置正则表达式以让我的爬虫忽略任何此类 URL,例如上面的示例,其 URL 路径中有多个“&”符号。

顺便说一句,在构建搜索引擎时忽略此类 URL 是否是个好主意?

【问题讨论】:

    标签: java regex nutch


    【解决方案1】:

    您在 Nutch 配置中的行应该是

    -&.*&
    

    这告诉 Nutch 跳过任何包含两个或更多 & 字符以及其间任意数量的字符的内容。

    忽略此类 URL 是否是一个好主意取决于您的搜索引擎的目的,以及您正在搜索的域中 URL 的性质。如果不了解问题域,就不可能回答问题的最后一句话。

    【讨论】:

    • 感谢大卫的帖子。我一般问这个问题是为了知道这是否是任何标准的面向公众的搜索引擎都遵循的做法,例如谷歌还是必应?
    • 我不相信 Google 或 Bing 会做这样的事情 - 他们当然不会丢弃只有两个&符号的 URL。他们可能会施加不同的限制,例如 32,但 Google 和 Microsoft 都不太可能发布该信息。
    • 我已经解释过了。两个 & 号。之间有任意数量的字符。 - 是对 Nutch 的指令,不是正则表达式的一部分。
    • 如果我必须将其更改为四个或更多?
    • 为了简单性和可读性,我会使用-&.*&.*&.*&,尽管有一种更有效的方法,即使用负前瞻。
    【解决方案2】:

    在字符串锚^的头部之后插入这个负前瞻

    (?![^&]*&){2}
    

    解释正则表达式

    (?!                      # look ahead to see if there is not (2
                             # times):
      [^&]*                  #   any character except: '&' (0 or more
                             #   times (matching the most amount
                             #   possible))
      &                      #   '&'
    ){2}                     # end of look-ahead
    

    【讨论】:

      【解决方案3】:

      由于您似乎要匹配符合每种情况的 URL,然后按这些情况进行过滤,因此匹配包含 2 &s 的 URL 相当简单。

      (&.*&)+
      

      这将匹配任何包含至少 2 个 & 符号的序列

      【讨论】:

      • 要么让它变得懒惰.*? 要么使用[^&]* 以避免不必要的回溯/匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多