如何以编程方式检查URL是否需要在python中进行转义?

时间:2010-10-24 04:06:43

标签: python escaping

使用lxml模块处理python中的小型Web蜘蛛我有一段代码,它对文档进行xpath查询,并将“a href”标记中的所有链接放入列表中。我想要做的是检查每个链接,因为它被添加到列表中,如果需要,请将其删除。我理解使用urllib.unquote()函数,但我遇到的问题是urllib方法抛出一个异常,我认为这是由于并非每个传递给该方法的链接都需要unescaping。谁能指出我正确的方向?这是我到目前为止的代码:

import urllib
import urllib2
from lxml.html import parse, tostring

class Crawler():

    def __init__(self, url):
        self.url = url
        self.links = []
    def crawl(self):

        doc = parse("http://" + self.url).getroot()
        doc.make_links_absolute(self.url, resolve_base_href=True)
        for tag in doc.xpath("//a"):
            old = tag.get('href')
            fixed = urllib.unquote(old)
            self.links.append(fixed)
        print(self.links)

3 个答案:

答案 0 :(得分:1)

由于不需要转义的网址,

unquote不会抛出异常。您没有向我们展示异常,但我猜测问题是old不是字符串,可能是None,因为您的<a>标记没有href属性。

在尝试使用之前检查old的值。

答案 1 :(得分:0)

url.find('%') > -1

或将urllib.unquote包裹在try .. except子句中。

答案 2 :(得分:0)

你可以这样做。虽然我没有导致例外的网址。所以这只是假设。看看这种方法是否有效。

from urllib import unquote

#get url from your parse tree.
url_unq = unquote(url or '')
if not url_unq:
    url_unq = url

看看这是否有效?如果您能提供导致异常的URL的实际示例,那将是很好的。什么例外?你可以发布StackTrace吗?

最糟糕的情况是,你总是可以在该区块附近使用try-except&amp;开展您的业务。