基于LXML解析器的BeautifulSoup find方法原理及参数报错咨询
BeautifulSoup中find方法的工作原理及报错解决
一、find方法的工作逻辑
在搭配LXML解析器的BeautifulSoup里,find()的作用是从当前节点开始遍历文档树,返回第一个匹配指定条件的标签元素:
- 可通过标签名直接匹配,比如
find('td')会定位第一个<td>标签 - 支持用关键字参数指定属性匹配,比如
class_(因class是Python关键字,故加下划线)、itemprop等,示例:find('td', class_='review-value') - 匹配不到符合条件的元素时返回
None - 依托LXML解析器的高效特性,遍历和匹配速度比默认HTML解析器更快
二、报错原因及解决
你遇到的TypeError: find() takes no keyword arguments,根源是代码变量名不一致:
看你的代码片段:
5 review = soup.find_all('article', itemprop = 'review') 6 for review in reviews: ----> 7 date_flown = review.find('td', class_ = 'review-value ')
第5行将find_all返回的结果集赋值给变量review,但第6行却遍历了未定义的reviews(多了一个s)。如果reviews是你之前定义的非BeautifulSoup对象(比如字符串、普通列表),它的find方法并非BeautifulSoup的方法,自然不支持关键字参数,才会触发报错。
修正后的代码:
# 正确赋值find_all的结果集 reviews = soup.find_all('article', itemprop='review') # 遍历结果集 for review in reviews: # 查找目标td标签 date_flown = review.find('td', class_='review-value ') if date_flown: # 建议获取标签内的文本内容,而非直接打印Tag对象 print(date_flown.get_text(strip=True))
同时要确保soup是正确初始化的,示例:
from bs4 import BeautifulSoup import requests # 获取网页内容并初始化soup res = requests.get("你要爬取的目标URL") soup = BeautifulSoup(res.text, 'lxml') # 明确指定lxml解析器
内容的提问来源于stack exchange,提问作者boyLern
相关产品推荐
相关产品推荐

