无法将字符串和列表从一个函数返回到另一个函数

问题描述 投票:2回答:3

我在python中创建了一个脚本来解析不同代理商的website address从它的登陆页面和location address的内页。我无法理解的是,我如何同时返回stringlist,以便在另一个函数中重用它们。为了更清楚:我希望从website address函数返回list of linkscollect_links()并在get_info()函数中重用它们。我目前的做法引发了一个错误 - ValueError: not enough values to unpack (expected 2, got 1)

这是我到目前为止的尝试:

import re
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def collect_links(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text, "lxml")
    website = [soup.select_one("p.company-profile-website > a").get("href")]
    items = [urljoin(url,item.get("href")) for item in soup.select("[id^='company-'] .search-companies-result-info h2 > a")]
    return website,items

def get_info(website,link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text, "lxml")
    address = soup.select_one("p.footer-right").get_text(strip=True)
    print(website,address)

if __name__ == '__main__':
    url = "https://www.cv-library.co.uk/companies/agencies/A"
    for item,link in collect_links(url):
        get_info(item,link)

如何将字符串和列表从一个函数返回到另一个函数?

PS我想坚持我已经尝试过的设计。

python python-3.x web-scraping
3个回答
2
投票

你的websites是一个带有单个元素字符串的list,而不是你在[]文字中包含它的字符串。您需要删除[]以使其成为一个字符串,因为没有必要使该列表成为一个列表。

执行此操作后,您可以获取返回值,并迭代链接,如:

if __name__ == '__main__':
    url = "https://www.cv-library.co.uk/companies/agencies/A"
    website, links = collect_links(url) 
    for link in links:
        get_info(website, link)

1
投票

代码中的主要错误在此链接中。

website = [soup.select_one("p.company-profile-website > a").get("href")]

这只返回一个值:

http://www.autoskills-uk.com

你的功能应该是:

def collect_links(link):
    res = requests.get(link)
    soup = BeautifulSoup(res.text, "lxml")
    websites = [x.get("href") for x in soup.select("p.company-profile-website > a")]    #<============== Changed
    items = [urljoin(url,item.get("href")) for item in soup.select("[id^='company-'] .search-companies-result-info h2 > a")]
    return zip(websites, items)

返回为网站和项目的zip。

现在你可以在for循环中列出unpack itemlink

if __name__ == '__main__':
    url = "https://www.cv-library.co.uk/companies/agencies/A"
    for item,link in collect_links(url):
        get_info(item,link)

0
投票

您将返回两个列表,一个包含一个元素,另一个包含许多元素作为元组,并尝试对此元组进行迭代,将每个列表解压缩为两个元素itemlink

我没有看到,你真正想做什么,但你应该分开for循环和返回值:

website, links = collect_links(url)
for link in links:
    get_info(website[0], link)
© www.soinside.com 2019 - 2024. All rights reserved.