使用LxmlSoup解析页面遇TypeError:意外关键字参数求助
LxmlSoup find函数报错TypeError: some keyword arguments unexpected的解决方法
问题原因
你遇到的错误是因为LxmlSoup的find方法不支持BeautifulSoup风格的class_参数命名。LxmlSoup内部调用的findel方法只接受原生属性名(比如直接用class),或者通过attrs字典传递属性。
另外原代码还有一处错误:.text()是错误的调用方式,LxmlSoup元素的文本内容是.text属性,而非可调用方法。
修正方案
方案1:直接使用class作为参数
LxmlSoup允许直接将class作为参数传递给find/find_all方法:
# 修正find的参数 item_elem = item_soup.find('span', class='cmp-product-details-main__heading-title') # 修正text的调用方式 item_name = item_elem.text
方案2:通过attrs字典传递属性
如果担心class作为关键字参数的潜在冲突,也可以用attrs字典统一传递属性:
item_elem = item_soup.find('span', attrs={'class': 'cmp-product-details-main__heading-title'}) item_name = item_elem.text
完整修正后的代码
import requests from LxmlSoup import LxmlSoup html = requests.get('https://www.mcdonalds.com/ua/uk-ua/eat/fullmenu.html').text soup = LxmlSoup(html) # 同时修正find_all的参数 urls = soup.find_all('a', class='cmp-category__item-link') items = [] for url in urls: link = "https://www.mcdonalds.com" + url.get("href") item_html = requests.get(link).text item_soup = LxmlSoup(item_html) # 增加元素存在性判断,避免页面结构变化导致报错 item_elem = item_soup.find('span', class='cmp-product-details-main__heading-title') if item_elem: item_name = item_elem.text items.append(item_name) else: print(f"未找到商品名称:{link}") print(items)
额外说明
- LxmlSoup的API设计和BeautifulSoup存在差异,不要直接照搬BeautifulSoup的参数写法
- 建议增加元素存在性判断,避免目标页面结构更新后,因找不到元素抛出异常
内容的提问来源于stack exchange,提问作者Nikita Grynov
相关产品推荐
相关产品推荐

