Разница между "findAll" и "find_all" в BeautifulSoup
Я хочу проанализировать HTML файл с помощью Python, и я использую модуль 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')
Кто-нибудь может сказать мне разницу?
Ответы
Ответ 1
В версии BeautifulSoup 4 методы точно такие же; версии для смешанного варианта (findAll
, findAllNext
, nextSibling
и т.д.) были переименованы в соответствие с Руководство по стилю Python, но старые имена по-прежнему доступны для упрощения переноса. См. Имена методов для полного списка.
В новом коде вы должны использовать нижестоящие версии, поэтому find_all
и т.д.
В вашем примере, однако, вы используете BeautifulSoup версии 3 (прекращено с марта 2012 года, не используйте его, если вы можете ему помочь), где доступен только findAll()
. Неизвестные имена атрибутов (например, .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