我在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我想坚持我已经尝试过的设计。
你的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)
代码中的主要错误在此链接中。
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 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)
您将返回两个列表,一个包含一个元素,另一个包含许多元素作为元组,并尝试对此元组进行迭代,将每个列表解压缩为两个元素item
和link
。
我没有看到,你真正想做什么,但你应该分开for循环和返回值:
website, links = collect_links(url)
for link in links:
get_info(website[0], link)