【问题标题】:Python Logical OperationPython 逻辑运算
【发布时间】:2013-12-02 05:04:16
【问题描述】:

我对 python 很陌生,我正在使用 Scrapy 库进行网络抓取项目。我没有使用内置域限制,因为我想检查指向域外页面的任何链接是否已失效。但是,我仍然希望将域内的页面与域外的页面区别对待,并尝试在解析响应之前手动确定站点是否在域内。

响应网址:

http://www.siteSection1.domainName.com

如果语句:

if 'domainName.com' and ('siteSection1' or 'siteSection2' or 'siteSection3') in response.url:
    parsePageInDomain()

如果 'siteSection1' 是第一个出现在 or 的列表中,则上述语句为真(页面已解析),但如果响应 url 相同但 if 语句如下,则不会解析页面:

if 'domainName.com' and ('siteSection2' or 'siteSection1' or 'siteSection3') in response.url:
        parsePageInDomain()

我在这里做错了什么?我无法非常清楚地思考逻辑运算符发生了什么,任何指导将不胜感激。谢谢!

【问题讨论】:

    标签: python operators logic scrapy


    【解决方案1】:

    or 不能这样工作。试试any

    if 'domainName.com' in response.url and any(name in response.url for name in ('siteSection1', 'siteSection2', 'siteSection3')):
    

    这里发生的情况是or 返回其两个参数的逻辑or - 如果x 计算结果为True,则x or y 返回x,这对于字符串意味着它不为空,或者y 如果x 不计算为True。所以('siteSection1' or 'siteSection2' or 'siteSection3') 的计算结果为'siteSection1',因为'siteSection1' 在被视为布尔值时是True

    此外,您还使用and 来组合您的条件。 and 如果该参数的计算结果为 False,则返回其第一个参数,如果第一个参数的计算结果为 True,则返回其第二个参数。因此,if x and y in z 不会测试xy 是否都在z 中。 in 的优先级高于 and - 我必须 look that up - 这样 测试if x and (y in z)。同样,domainName.com 的计算结果为 True,因此这将仅返回 y in z

    相反,any 是一个内置函数,它接受一个可迭代的布尔值并返回TrueFalse - 如果其中任何一个是True,则返回True,否则返回False。一旦达到True 值,它就会停止工作,因此它很有效。我正在使用生成器表达式来告诉它继续检查您的三个不同的可能字符串,以查看它们中的任何一个是否在您的响应网址中。

    【讨论】:

    • 谢谢彼得,这非常有用。很好的答案,非常感谢!
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多