【问题标题】:python checking for value doesnt workpython检查值不起作用
【发布时间】:2013-09-13 08:03:26
【问题描述】:

我正在寻找“未找到”的值,但我的代码没有找到它。相反,如果该值未找到,它只会崩溃

这里是代码

for key, value in productLinks.iteritems():
        if value is "Not Found":
                 print value
        else:
                 print value
                 html = urllib2.urlopen(value)
                 soup = BS(html)
                 foundPrice = soup.find('s')
                 if found is not None:
                        print "found a price"
                 else:
                        print" No Lunk"

这是错误

Traceback (most recent call last):
  File "asimsScrapper.py", line 28, in <module>
    html = urllib2.urlopen(value)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 386, in open
    protocol = req.get_type()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 248, in get_type
    raise ValueError, "unknown url type: %s" % self.__original
ValueError: unknown url type: Not found

【问题讨论】:

  • “未找到”与“未找到”不同,对吧?
  • 太聪明了,亚历克西斯。太聪明了。

标签: python python-2.7 python-3.x


【解决方案1】:

is关键字用于身份比较、类型检查。

您可能想使用==

if value == "Not Found"

此外,您可以验证 url,而不是检查 Not Found(或 Not found)字符串,如下所示:

for key, value in productLinks.iteritems():
    if value.startswith('http'):
         print value
         html = urllib2.urlopen(value)
         ...

或者,最好使用urlparse 来验证网址。

另见:

【讨论】:

  • 好的,is 不用于 python 中的类型检查,它(本质上)检查内存地址。请参阅 stackoverflow.com/questions/306313/… 或此材料上的其他数千个参考资料之一。
  • @ap 好的,谢谢,重要的是 OP 不应该在这里使用它。
  • 显然,这对手头的实际问题也无关紧要。他似乎正在尝试使用字符串“未找到”作为 url,并通过库将其传递回他的胶水代码。 Python 没有内置的“未找到”monad,所以这行不通……
  • 耶稣每个人都赞成这个,因为它解决了一个明显的问题——在回答之前阅读问题。他的踪迹应该提供一些证据表明这不是当前的问题。打开 ipy 并输入 __import__('urllib2').urlopen('not found') 我保证你会得到同样的错误。弄清楚 SOirclejerkers。
【解决方案2】:

错误:

html = urllib2.urlopen(value),
unknown url type: Not found

您正在尝试打开url = "Not found"

根本原因是:value is "Not found",请使用:value == "Not found"

【讨论】:

    【解决方案3】:

    alecxe 是对的,你应该使用== 来检查值等价,但他的理由是错误的。如有疑问,请始终使用== 测试等价——is 只是测试 identity,这与等价不同。身份更多地与存储在内存中的位置有关,而不是与内存中的值有关。在 SO 和其他地方有很多地方可以阅读此内容,但要点是 is 不是 ==

    您的错误似乎与此无关。如果您尝试urllib2.urlopen("not found"),它肯定会给您这个错误。您想在将其传递给urllib2 之前尝试捕获它。

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2016-08-24
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多