BeautifulSoup处理XML时find_next跳出employee节点取值错误问题
问题原因
BeautifulSoup的find_next()方法的作用是查找整个文档树中当前节点之后的第一个匹配节点,本身不会受当前节点所属父节点的范围限制。你代码中employee节点下的given节点(对应值Jill)之后,整个文档里的下一个given标签属于manager节点,对应值为H,因此会跨节点拿到错误结果。而manager节点的逻辑运行正常,是因为manager节点本身就包含两个given标签,第一个given的find_next匹配结果刚好还在manager节点内部,因此没有触发异常。
修复方案
你可以将查找范围限制在当前<name>节点内部,直接从<name>节点下获取所有given标签,按索引取值,不存在对应索引时返回指定的空值即可,修改后的代码如下:
employee = soup.find("employee") for name_node in employee.find_all('name'): given_list = name_node.find_all('given') # 取名字 fname = given_list[0].get_text() if len(given_list) >= 1 else None print("Emp_F_Name: ", fname) # 取中间名,没有第二个given时返回指定值 mname = given_list[1].get_text() if len(given_list) >= 2 else "None or NULL" print("Emp_M_Name: ", mname) # 取姓氏 lname = name_node.find('family').get_text() if name_node.find('family') else None print("Emp_L_Name: ", lname)
该逻辑同样适配manager节点,只需要将查找根节点替换为manager即可直接复用。
内容的提问来源于stack exchange,提问作者Jaytee
相关产品推荐
相关产品推荐

