代码的相关部分是:
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 链接 ......等等
答案 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')