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

时间:2019-03-27 11:16:35

标签: python python-3.x web-scraping

我已经在python中创建了一个脚本,以从其着陆页和内部页的website address解析不同机构的location address。我不明白的是,我如何同时返回一个string和一个list以便在另一个函数中重用它们。更清楚地说:我希望从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,我想坚持使用我已经尝试过的设计。

3 个答案:

答案 0 :(得分: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 :(得分: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循环中列出解压缩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)

答案 2 :(得分:0)

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

我不知道您真正想做什么,但是您应该分开for循环并返回值:

website, links = collect_links(url)
for link in links:
    get_info(website[0], link)