urljoin 处理正则匹配结果时的错误

问题:

将一个baseurl与正则匹配出来的href进行urljoin处理为A,将baseurl与文本href进行urljoin处理的结果为B,结果A与B不一致,A不符合需求。

代码:

# coding:utf-8

import re
from urlparse import urljoin

pageUrl = 'http://exapmple.com/a/b/c.htm'
itemContent = '<p>\n<a HrEf="/slash.html">slash</a>\n<a HrEf="1.html">page</a>\n<a hrEF="./2.html">1dot</a>\n<a hrEF="../3.html">2dots</a>\n<a hrEF="www.baidu.com/2.html">host</a>\n<a hrEF="http://www.baidu.com/index.html">fullurl</a>\n</p>'
p = re.compile(r'[Hh][Rr][Ee][Ff]=[\'"](?P<url>(?!([Hh][Tt][Tt][Pp][Ss]?://)).*?)[\'"]')
print re.sub(p, 'href="' + urljoin(pageUrl, r'\1') + '"', itemContent)

输出:

<p>
<a href="http://exapmple.com/a/b//slash.html">slash</a>
<a href="http://exapmple.com/a/b/1.html">page</a>
<a href="http://exapmple.com/a/b/./2.html">1dot</a>
<a href="http://exapmple.com/a/b/../3.html">2dots</a>
<a href="http://exapmple.com/a/b/www.baidu.com/2.html">host</a>
<a hrEF="http://www.baidu.com/index.html">fullurl</a>
</p>

不明白的是:
如果将最后print语句中urljoin的第二个参数改为直接文本,则处理正常,例如若用:

print re.sub(p, 'href="' + urljoin(pageUrl, '/slash.html') + '"', itemContent)

处理第一条url的结果会是符合需求的:

<a href="http://exapmple.com/slash.html">slash</a>

那么,这是为什么呢?

阅读 3.5k
1 个回答

不知道为什么直接引用匹配组作为urljoin的参数不行,但是在匿名函数内调用urljoin并将匹配组传入urljoin是可以的,如下:

import re
from urlparse import urljoin

pageUrl = 'http://exapmple.com/a/b/c.htm'
itemContent = '<p>\n<a HrEf="/slash.html">slash</a>\n<a HrEf="1.html">page</a>\n<a hrEF="./2.html">1dot</a>\n<a hrEF="../3.html">2dots</a>\n<a hrEF="www.baidu.com/2.html">host</a>\n<a hrEF="http://www.baidu.com/index.html">fullurl</a>\n</p>'
p = re.compile('href=[\'"](?P<url>(?!(https?://)).*?)[\'"]', re.I)
print p.sub(lambda x: 'href="' + urljoin(pageUrl, x.group(1)) + '"', itemContent)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题