BeautifulSoup 中“findAll”和“find_all”的区别

Posted

技术标签:

【中文标题】BeautifulSoup 中“findAll”和“find_all”的区别【英文标题】:Difference between "findAll" and "find_all" in BeautifulSoup 【发布时间】:2012-09-02 14:09:15 【问题描述】:

我想用 Python 解析一个 html 文件,我使用的模块是 BeautifulSoup。

据说find_all的功能和findAll一样。我都试过了,但我相信它们是不同的:

import urllib, urllib2, cookielib
from BeautifulSoup import *
site = "http://share.dmhy.org/topics/list?keyword=TARI+TARI+team_id%3A407"

rqstr = urllib2.Request(site)
rq = urllib2.urlopen(rqstr)
fchData = rq.read()

soup = BeautifulSoup(fchData)

t = soup.findAll('tr')

谁能告诉我区别?

【问题讨论】:

您使用的是哪个版本的 beautifulsoup?如果你应该使用 BS4,那么 import 应该是from bs4 import BeautifulSoup。见crummy.com/software/BeautifulSoup/bs4/doc/#porting-code-to-bs4 有什么区别?我的意思是,您说您同时使用了两者,并且看到了不同之处。您能否发布一些显示不同行为的输出?或者你在问为什么有两种方法可以做同样的事情?在这种情况下,Martijn Pieters 是正确的。 find_all : 找不到模块 findAll : 找到了几部分html代码。 【参考方案1】:

在 BeautifulSoup 版本 4 中,方法完全相同;混合大小写的版本(findAllfindAllNextnextSibling 等)已全部重命名为符合 Python style guide,但 名称仍可用于移植更轻松。有关完整列表,请参阅 Method Names。

在新代码中,您应该使用小写版本,例如find_all等。

但是,在您的示例中,您使用的是 BeautifulSoup version 3(自 2012 年 3 月起停止使用,如果可以提供帮助,请不要使用它),其中只有 @987654327 @ 可用。未知属性名称(例如 .find_all,仅在 BeautifulSoup 4 中可用)被视为您正在搜索该名称的标签。您的文档中没有 <find_all> 标记,因此为此返回 None

【讨论】:

【参考方案2】:

来自BeautifulSoup的源码:

http://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/bs4/element.py#L1260

def find_all(self, name=None, attrs=, recursive=True, text=None,
                 limit=None, **kwargs):
# ...
# ...

findAll = find_all       # BS3
findChildren = find_all  # BS2

【讨论】:

以上是关于BeautifulSoup 中“findAll”和“find_all”的区别的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 Python 中使用 BeautifulSoup 得到“'ResultSet' 没有属性 'findAll'”?

在 Beautifulsoup 中执行 findAll() 时跳过特定元素的内容

BeautifulSoup库findAll()find()方法详解

BeautifulSoup:抓取蒸汽愿望清单游戏 - .findAll 不返回在检查器中可见的嵌套 div

使用 BeautifulSoup 排除 findAll 的不需要的结果

Beautifulsoup findall