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 中,方法完全相同;混合大小写的版本(findAll
、findAllNext
、nextSibling
等)已全部重命名为符合 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