我是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()
我在这里做错了什么?我无法非常清楚地思考逻辑运算符的情况,我们将非常感谢任何指导。谢谢!
答案 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
不会测试x
和y
是否在z
中。 in
的优先级高于and
- 我必须look that up - 所以
测试if x and (y in z)
。同样,domainName.com
评估为True,因此这将仅返回y in z
。
any
是一个内置函数,它接受一个可迭代的布尔值并返回True
或False
- True
(如果其中任何一个是True
},False
否则。它一旦达到True
值就会停止工作,因此效率很高。我正在使用生成器表达式告诉它继续检查您的三个不同的可能字符串,看看它们是否在您的响应URL中。