Python:你如何使用re来忽略括号中的链接?

时间:2011-09-13 18:00:38

标签: python regex

代码的相关部分是:

import re
reargs = '<a\s*href=[\'|"](.*?)[\'"].*?>'
link = re.search(reargs,content,flags=re.IGNORECASE)

我正在构建一个爬虫,我正在使用的网页在括号中有我不想要的链接,所以它会像:

Foo foo foo foo( link )foo foo foo foo link foo foo foo foo(foo link foo)foo foo 链接 foo foo 链接 ......等等

3 个答案:

答案 0 :(得分:0)

如果可以存在多组嵌套括号,例如“((foo) link )”,我认为这对于正则表达式是不可能的。特别要注意的是,括号可以在URL中使用(例如在wikipedia),因此即使文本本身不包含任何内容,也可能仍然存在嵌套的parens。因此,在一般情况下,我认为这不能用正则表达式完成。

为了解决这个问题,我假设您最多可以有1个括号,并且没有包含括号的URL。

你正在寻找的正则表达式如下:

(\([^\)]*\)|[^\(<])*_link_

其中_link_是匹配链接的正则表达式(您在问题陈述中描述,但可能需要进行一些调整)。总结一下我的正则表达式的第一部分是什么:它匹配0或更多的括号语句或非链接的非括号字符。现在,使用匹配的反向引用(示例中为link.group(2))来查找您的URL。

答案 1 :(得分:0)

通常使用正则表达式解析HTML是个坏主意。但是因为你问过,而且一般性的问题是有价值的(如何忽略你的比赛被括号括起来的情况)我会告诉你我的想法。

现在,因为我不知道您的网页是什么样的,我只想说,一般情况下,您可以通过添加[^x]来排除匹配,除非x是您不喜欢的字符不想要。括号使它匹配任何东西,^排除后面的内容。

因此,您可以通过用[^(] foo [^)]包围匹配字符串来排除括号。如果括号之间还有其他字符,则必须单独说明。

答案 2 :(得分:0)

使用lxml,您可以执行以下操作:

import lxml.html
import re

tree = lxml.html.parse("http://pastehtml.com/view/b7604in99.html")
links = tree.xpath("//a")

for link in links:
    if re.match(r'^\(.*\)$', link.text.strip()):
        print link.get('href')