【问题标题】:Iterate over list of URLs and open each url with Selenium遍历 URL 列表并使用 Selenium 打开每个 url
【发布时间】:2020-05-15 02:37:51
【问题描述】:

我有一个 URL 列表,我需要用 selenium 打开、执行脚本并提取某些链接。

到目前为止我做了什么:

import re
from selenium import webdriver

###  Variables  ###

regexp = re.compile(r'\.[\.a-z]?[\.a-z]?\/')


###  Function  ###

def get_links():

    driver = webdriver.Firefox(executable_path=r'/usr/local/bin/geckodriver')
    urls = ['https://www.url1.com.gt/', 'https://www.url2.com.co/', 'https://www.url3.com.pe']

    for url in urls:

        links = []
        target = []

        country = re.search(regexp, url).group()

        driver.get(url)
        driver.execute_script('return document.documentElement.outerHTML')

        hrefs = driver.find_elements_by_xpath('//a[@href]')

        for href in hrefs:

            links.append(href.get_attribute('href'))

        for link in links:

            if 'string to check' in link:
                target.append(link)

        return country, target


country, target = get_links()
df = {country: target}
print(df)

预期的输出是一个带有键:国家和值:匹配的链接的字典。

当我运行此代码时,它会正确执行,但不会遍历 URL 列表,它只会打开并返回第一个 URL 的数据。

如果我在 urls 循环中将 return 语句放在 for url 之外,它会返回第三个 URL 的数据。

如何获取列表中所有 URL 的信息?

【问题讨论】:

  • 我认为targetlink会在for循环之外定义?对于循环中的每个 url,您将 targetlink 重新定义为空列表。
  • @Andrex 如果我这样做,结果相同。你得到第一个 URL 的数据

标签: python python-3.x selenium selenium-webdriver


【解决方案1】:

看起来return 语句是在 for 循环中定义的。因此,预计您只会获得第一个 URL,因为函数在第一个循环后退出。也就是说,您是否尝试过 @Andrex 建议的方法,即在 for 循环之外定义 targetlink 并取消缩进 return county, target 使其位于主 for 循环之外?所以最终的代码应该是这样的:

def get_links():
    [SOME CODE]

    data = {}

    for url in urls:
        links = []
        target = []

        [SOME CODE]

        data[country] = target

    return data # Unindented

希望此编辑后的代码可以帮助您获得所需的结果。

【讨论】:

  • 现在它会打开所有 URL,但返回数据只匹配最后一个 URL 信息。我们越来越近了!
  • 这可能是因为我们没有在函数中收集country 信息。换句话说,我们有country = re.search(regexp, url).group(),但我们并没有对这些信息做任何事情。因此,一种方法可能是使用字典来存储所有“{country:target}”信息,如果您不确定我的意思,请随时联系。
  • 这样更好!现在正在抓取所有 URL 的所有信息。我所做的让我更好地阅读它是创建一个数据框。现在唯一的问题是它为每列中的每个 URL 添加了所有目标值。列:{A:来自 url1、url2 和 url3 的链接},{B:来自 url1、url2 和 url3 的链接}; {C:来自 url1、url2 和 url3 的链接}
  • 太棒了!很高兴能提供帮助。
  • (抱歉,整理前不小心添加了评论)。假设你的字典看起来像data = { 'gt':[url1a, url2a, ..], 'co':[url1b, url2b,..]},你可以做的是df = pd.DataFrame.from_dict(data, orient='index')。这将使每一行都是country,每列是target url。如果您想将 url 列表保留为单列,一种方法是在所有值中添加另一个 [],使其看起来像:data = { 'gt':[ [url1a, url2a, ..] ], 'co': [ [url1b, url2b,..] ]}
猜你喜欢
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多