尝试使用 any() 更改 url 中的单词

Trying to use any() to change a word in a url

我正在尝试创建一个程序,该程序接受郊区的用户输入,然后 returns 该郊区的好咖啡馆列表。

我正在抓取的网页有许多不同郊区的好咖啡馆名单,但没有我居住的每个郊区的名单。

到目前为止,我所做的是创建代码以获取郊区列表,然后创建代码以使用 f 字符串为“最佳”咖啡馆抓取网页。我的旧代码意味着我必须手动输入网站上有 elif 语句页面的每个郊区。像这样:

def cafe_search():
    user_suburb = input("What Suburb?")
    if user_suburb == "Thornbury":
        print(get_cafes("thornbury"))
    elif user_suburb == "Northcote":
        print(get_cafes("northcote"))
    elif user_suburb == "Carlton":
        print(get_cafes("carlton"))        

但我正在尝试找到一种方法来使用“suburb_list”,我从维基百科中提取,然后将其与用户的输入相匹配以添加到 f 字符串表达式中,然后检查该郊区是否有咖啡馆清单。我试图用这个 f-string 来做到这一点:

f"https://www.broadsheet.com.au/melbourne/guides/best-cafes-{user_suburb}"

我正在尝试使用 any() 函数来执行此操作...不确定成功率如何?如果有任何提示,我将不胜感激。 PS,我对这一切都很陌生,这是我的第一个项目,所以我的问题可能有点笨拙,我的代码效率低下,抱歉!

#import stuff to open and scrape websites
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import requests
    from requests import get
    
#suburbs
#open suburb listing
url_suburbs = "https://en.wikipedia.org/wiki/List_of_Melbourne_suburbs"
html_suburbs = urlopen(url_suburbs)

soup_suburb_list = BeautifulSoup(html_suburbs, 'html.parser')
type(soup_suburb_list)
    
#grab suburb names
suburbs_containers = soup_suburb_list.select(".mw-parser-output > ul")

    suburbs = []
    for container in suburbs_containers: 
        suburb_list = container.find_all('a')
        for suburb in suburb_list:
            suburbs.append(suburb.text)

#cafes
    
def get_cafes(user_suburb):
    #open url
        url_cafes = f"https://www.broadsheet.com.au/melbourne/guides/best-cafes-{user_suburb}"
        html_cafes = urlopen(url_cafes)
    
    #create beautiful soup object for cafes
        soup_cafe_list = BeautifulSoup(html_cafes, 'html.parser')
        type(soup_cafe_list)

    #grab cafe names
        cafe_names = soup_cafe_list.find_all("h2", class_= "venue-title")
        print (cafe_names)
    
    #function to search cafes        
def cafe_search():
        user_suburb = input("What Suburb?")
        if user_suburb == any(suburbs):
            print(get_cafes("user_suburb"))

any(mylist) returns 如果 mylist 中的任何内容在 Python 测试 True 的方式中为 True - 就像 or on mylist 值。同样,all(Mylist) 类似于 mylist 中值的 and。参见 docs.python.org/3.8/library/functions.html#any

所以要检查您的代码:

if user_suburb == any(suburbs):

any(suburbs) 将 return True 如果 suburbs 不是零长度,并且 user_suburb 不是值 True,所以测试总是会失败。

更多关于 Python 的真值测试在这里,见下文 真值测试 - 值得一读! - https://docs.python.org/3.8/library/stdtypes.html

所以你不能使用 any()in 运算符对列表起作用,所以更改:

if user_suburb == any(suburbs)

if user_suburb in suburbs

您可能需要注意大小写一致,因为 in 区分大小写 - 可能最简单的方法是将进入郊区的所有内容小写,并在使用 [=29 之前将 user_suburb 小写=]

suburbs 列表更改为小写,例如

suburbs.append(suburb.text)

suburbs.append(suburb.text.lower())

并将检查更改为:

if user_suburb.lower() in suburbs: