我用 python 编写了一个脚本,使用 .get_links( )
函数。然后我创建了另一个函数 .get_info()
以到达另一个页面(使用从第一个函数派生的链接)以便从那里抓取电话号码。
如果我的目标是解析该网页中的两个项目,我根本不需要创建第二个函数,因为它们已经在着陆页中可用。
但是,我希望我的解析器的行为方式是在第二个函数中打印 names
(从第一个函数继承)以及 phone numbers
那里。最重要的是,我不想踢出第二个函数中定义的 for loop
。如果 for 循环
不在第二个函数中,那么问题就不会出现。在不使用 for 循环
的情况下,我已经可以获得所需的输出。
到目前为止,这是我的脚本:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
url = "https://potguide.com/alaska/marijuana-dispensaries/"
def get_links(link):
session = requests.Session()
session.headers['User-Agent'] = 'Mozilla/5.0'
r = session.get(link)
soup = BeautifulSoup(r.text,"lxml")
for items in soup.select("#StateStores .basic-listing"):
name = items.select_one("h4 a").text
namelink = urljoin(link,items.select_one("h4 a").get("href")) ##making it a fully qualified url
get_info(session,name,namelink) ##passing session in order to reuse it
def get_info(session,title,url):
r = session.get(url)
soup = BeautifulSoup(r.text,"lxml")
for items in soup.select("ul.list-unstyled"): ##if I did not use for loop I could get the output as desired.
try:
phone = items.select_one("a[href^='tel:']").text
except:
phone = ""
print(title,phone)
if __name__ == '__main__':
get_links(url)
我得到的输出:
AK Frost
AK Frost
AK Frost
AK Frost
AK Frost
AK Frost (907) 563-9333
AK Frost
AK Frost
AK Frost (907) 563-9333
AK Frost
AK Fuzzy Budz
AK Fuzzy Budz (907) 644-2838
AK Fuzzy Budz
AK Fuzzy Budz
AK Fuzzy Budz (907) 644-2838
我的预期输出:
AK Frost (907) 563-9333
AK Fuzzy Budz (907) 644-2838
最佳答案
如果目标只是获得预期的输出,这应该可行:
def get_info(session,title,url):
r = session.get(url)
soup = BeautifulSoup(r.text,"lxml")
for items in soup.select("ul.list-unstyled"):
try:
phone = items.select_one("a[href^='tel:']").text
except:
# skip item and continue
continue
else:
# exception wasn't rised, you have the phone
print(title,phone)
break
关于python - 无法在另一个函数中以正确的方式打印名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50492428/