在单个循环中运行多个测试的最有效方法是什么?蟒

时间:2018-06-13 14:22:43

标签: python python-3.x loops processing-efficiency

目标:访问博客页面列表。在每个博客页面上,找到该博客页面的社交链接(Instagram,Facebook,Twitter)。

假设:每个社交链接的第一次出现将是正确的。页面中稍后出现的内容更有可能引用其他人的帐户。

理想的社交网址格式为www。 social_network_name .com / username

某些格式的网址不可取(例如instagram.com/abc /)

def check_instagram(url):
   if 'instagram.com/' in url and "instagram.com/abc/" not in url::
      return True

def check_facebook(url):
   if 'facebook.com/' in url and "facebook.com/abc/" not in url::
      return True

#my list of pages t be parsed
pages_to_check = ['www.url1.com', 'www.url2.com', ... 'www.urn_n.com']

#iterate through my list of pages t be parsed
for page in pages_to_check :

   #get all the links on the page
   page_links = *<selenium code to get all links on page>*

我试过......

  For link in page_links:

     #when first Instagram handle found
     if check_instagram(url):
        *code to write to a dataframe here*            
        break

     #when first Instagram handle found
     if check_facebook(url):
        *code to write to a dataframe here*
        break

问题:只要我匹配一个社交网址,它就会突破循环,并且不会继续寻找其他网络句柄。

我能想到的一些选择,如果不是很好。我是一个Noob。我非常感谢你的一些建议。

选项#1 - 遍历所有链接并测试ONE社交网络的首次匹配。循环遍历所有链接并测试NEXT社交网络的首次匹配。 (讨厌这个)

选项#2 - 为每个社交URL创建变量。为匹配创建一些标记,仅更新匹配的变量未设置。 (更好,但在我填写所有变量之后,我仍然会继续迭代)

选项#3 - 欢迎提出任何建议或意见。你会怎么做到这一点?

1 个答案:

答案 0 :(得分:1)

<强> 建议

保留跟踪器并更新已处理的任何社交媒体网址。一旦他们全部被处理,然后突破循环。

<强> 代码

tracker = dict.fromkeys(['facebook', 'instagram'], False)

for link in page_links:
    # if all the values of the tracker are true, then break out of the loop
    if all(v for v in tracker.values()):
        break
    # when first Instagram handle found
    if check_instagram(url):
        *code to write to a dataframe here*
        tracker['instagram'] = True
     # when first Facebook handle found
     if check_facebook(url):
        *code to write to a dataframe here*
        tracker['facebook'] = True

我希望这证明有用。