Python逻辑操作

时间:2013-12-02 05:04:17

标签: python operators logic scrapy

我是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()

我在这里做错了什么?我无法非常清楚地思考逻辑运算符的情况,我们将非常感谢任何指导。谢谢!

1 个答案:

答案 0 :(得分:6)

or不起作用。试试any

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

这里发生的是or返回其两个参数的逻辑or - 如果x or y评估为x,则x会返回True },对于字符串表示它不为空,或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值就会停止工作,因此效率很高。我正在使用生成器表达式告诉它继续检查您的三个不同的可能字符串,看看它们是否在您的响应URL中。