You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeautifulSoup封装finder函数传参调用find返回None问题

故障原因
  • 传参格式错误:soup.find()的调用规则是第一个参数传标签名字符串,第二个可选参数传属性匹配字典。你把价格标签的匹配规则拼成了一整段字符串"'span', {'itemprop':'price'"存入列表,相当于告诉BeautifulSoup要找标签名就是这整串字符的元素,完全不符合方法入参要求,自然返回None。这也是硬编码能跑、传变量跑不通的核心原因:硬编码时你传的是两个独立参数,传变量时你传的是一个格式错误的字符串。
  • 语法残缺:你存储的价格匹配字符串里,属性字典缺少右闭合},本身就是不完整的内容。
  • 逻辑错误:soup.find()返回的是Tag对象,不是字符串,直接调用字符串方法.replace()会触发类型错误,必须先取Tag的.text属性拿到标签内的文本内容,才能做后续替换、转数字操作。
修正代码

调整参数存储逻辑,不要把匹配规则拼成字符串,直接把每个查找操作需要的入参按顺序存在子列表里,调用时用*解包传参即可:

# llibreria x fer peticions html
import requests
#importem el Soup per fer busquedes al web
from bs4 import BeautifulSoup

#funcio x buscar a la web i fer codi reutilizable n
def finder(url):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
    page = requests.get(url[0], headers=headers)
    soup = BeautifulSoup(page.content, "html.parser")
    # 解包传入标题查找参数
    result = soup.find(*url[1])
    # 解包传入价格查找参数,先拿到标签再取文本
    price_tag = soup.find(*url[2])
    price = price_tag.text.replace("€","").replace(".","")
    price = int(price)
    print("__________ House Finded _________")
    print(result.text.strip())
    print(price)
    print("________________________________")
    
# 查找参数按soup.find的入参顺序存为子列表,不要拼成字符串
habitaclia =[ 
    "https://www.habitaclia.com/comprar-casa_pareada-en_venta_en_llanca_el_colomer_la_bateria_la_coma-llansa-i16454000001818.htm?hab=3&ordenar=precio_mas_bajo&st=3,6,8,10,12,15&f=parking&geo=p&from=list&lo=55", 
    ["h1"], 
    ["span", {"itemprop":"price"}]
]
finder(habitaclia)

如果后续要加更复杂的查找规则(比如class匹配、多属性匹配),直接往对应的子列表里按soup.find的参数顺序追加内容就行,不需要改finder函数的核心逻辑。

内容的提问来源于stack exchange,提问作者Miquel Macau Aznar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:57:14