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

发布于 2022-09-02 09:53:42 字数 1569 浏览 12 评论 0

问题:

将一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

好菇凉咱不稀罕他 2022-09-09 09:53:42

不知道为什么直接引用匹配组作为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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文