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
相关产品推荐
相关产品推荐

