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>
那么,这是为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不知道为什么直接引用匹配组作为urljoin的参数不行,但是在匿名函数内调用urljoin并将匹配组传入urljoin是可以的,如下: