所以这是我必须提取的链接:
http://www.hrmagazine.co.uk/article-details/finance-sector-dominates-working-families-benchmark
这就是我目前的
.+\/article-details\/.+\-.+\-.+\-.+\-.+\-.+$
然而,问题是它在" / article-details /"之后提取了任意数量的单词和连字符。部分,而不是具体的6个单词标题,用连字符代替上面的空格。所以它会接受一个糟糕的结果
http://www.hrmagazine.co.uk/article-details/finance-sector-dominates-working-families-benchmark-test
当我需要它时只接受像这种格式的链接
http://www.hrmagazine.co.uk/article-details/one-two-three-four-five-six
此类网站的正确正则表达式是什么?我在Scrapy / Spyder中提供的当前提取器如下
rules = (Rule(LinkExtractor(allow=['.+\/article-details\/.+\-.+\-.+\-.+\-.+\-.+$']), callback='parse_item', follow=True),)
答案 0 :(得分:0)
正则表达式中的每个.+
都可以匹配任意数量的任何字符 - 包括连字符。因此,您的整体正则表达式只需要至少5个连字符,而不是精确计数。使用[^-]+
仅匹配非连字符。
请注意,正则表达式中没有任何反斜杠可以完成任何操作 - 在任何情况下,以下字符都不需要转义。即使它们是,你也需要加倍反斜杠,或者使用原始字符串r'whatever'
,以便re
模块解释反斜杠,而不是Python&#39}。字符串文字解析规则。
答案 1 :(得分:0)
尝试用.
之类的内容替换[a-z]
; .
也会匹配连字符,这就是为什么它匹配无限数量的单词:
.+\/article-details\/[a-z]+\-[a-z]+\-[a-z]+\-[a-z]+\-[a-z]+\-[a-z]+$
如果您需要匹配数字之类的内容,请将它们添加到括号中([a-z0-9]
等)。