我已经在python中创建了一个脚本,以从其着陆页和内部页的website address
解析不同机构的location address
。我不明白的是,我如何同时返回一个string
和一个list
以便在另一个函数中重用它们。更清楚地说:我希望从website address
函数返回list of links
和collect_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,我想坚持使用我已经尝试过的设计。
答案 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循环中列出解压缩item
和link
的情况:
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)
您将返回两个列表,一个包含一个元素,另一个包含许多元素作为一个元组,并尝试对该元组进行迭代,将每个列表解压缩为两个元素item
和link
。 / p>
我不知道您真正想做什么,但是您应该分开for循环并返回值:
website, links = collect_links(url)
for link in links:
get_info(website[0], link)