Operación lógica de Python

Soy bastante nuevo en Python y estoy trabajando en un proyecto de raspado web utilizando la biblioteca Scrapy. No estoy usando la restricción de dominio incorporada porque quiero verificar si alguno de los enlaces a páginas fuera del dominio está muerto. Sin embargo, todavía quiero tratar las páginas dentro del dominio de manera diferente a las que están fuera de él e bash determinar manualmente si un sitio está dentro del dominio antes de analizar la respuesta.

URL de respuesta:

http://www.siteSection1.domainName.com 

Si la statement:

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

La statement anterior es verdadera (la página se analiza) si ‘siteSection1’ es el primero en aparecer en la lista de or’s pero no analizará la página si la url de respuesta es la misma pero la statement if fue la siguiente:

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

¿Qué estoy haciendo mal aquí? No he podido pensar con claridad lo que está sucediendo con los operadores lógicos y cualquier orientación sería muy apreciada. ¡Gracias!

or no funciona de esa manera. Prueba any

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

Lo que sucede aquí es que or devuelve un lógico or de sus dos argumentos: x or y devuelve x si x evalúa como True , lo que para una cadena significa que no está vacío, y si si x no se evalúa como True . De modo que ('siteSection1' or 'siteSection2' or 'siteSection3') evalúa como 'siteSection1' porque 'siteSection1' es True cuando se considera como un valor booleano.

Además, también estás utilizando and para combinar tus criterios. and devuelve su primer argumento si ese argumento se evalúa como False , o su segundo argumento si el primer argumento se evalúa como True . Por lo tanto, if x and y in z no comprueban si tanto x como y están en z . in tiene mayor prioridad que and , y tuve que buscar eso , de modo que se compruebe if x and (y in z) . Nuevamente, domainName.com evalúa como Verdadero, por lo que esto devolverá solo y in z .

any , a la inversa, es una función incorporada que toma un iterable de booleanos y devuelve True o False : True si alguno de ellos es True , False contrario. Detiene su trabajo tan pronto como alcanza un valor True , por lo que es eficiente. Estoy usando una expresión generadora para indicarle que siga revisando sus tres cadenas posibles para ver si alguna de ellas está en su url de respuesta.