BeautifulSoup find_all()是否保留标记顺序?

时间:2015-11-11 16:13:02

标签: python-2.7 beautifulsoup

我希望使用BeautifulSoup来解析一些HMTL。我有一个有几行的表。我试图找到满足某些条件(某些属性值)的行,并在我的代码中稍后使用该行的索引。

问题是:find_all()是否保留了我返回的结果集中行的顺序?

我在docs中找不到这个,谷歌搜索只让我this answer

  

' BeautifulSoup代码不会在页面中跟踪他们的订单,没有。'

但他并没有说明他从哪里得到这些信息。

我对答案感到满意,但对指向解释此问题的文档的指针更为满意。

编辑:dstudeba向我指出了这个'解决方法'使用next_sibling

from bs4 import BeautifulSoup
soup = BeautifulSoup(open('./mytable.html'), 'html.parser')
row = soup.find('tr', {'class':'something', 'someattr':'somevalue'})
myvalues = []
while True:
    cell = row.find('td', {'someattr':'cellspecificvalue'})
    myvalues.append(cell.get_text())
    row = row.find_next_sibling('tr', {'class':'something', 'someattr':'somevalue'})
    if not row:
        break

这会按照我们在html文件中出现的顺序获取我需要的单元格内容。

但是,我仍然想知道在BeautifulSoup文档中我可以找到find_all()是否保留顺序。这就是为什么我不接受dstudeba的回答。 (我的upvote没有显示,还没有足够的代表:P)

1 个答案:

答案 0 :(得分:4)

根据我的经验,find_all确实保留了秩序。但是,要确保您可以使用find_all_next方法,该方法使用保留订单的find_next方法。 Here is a link到文档。