使用BeautifulSoup解析HTML

2 投票
3 回答
1497 浏览
提问于 2025-04-17 19:50

我想用Python的BeautifulSoup模块来读取网页上的一个列表。网页的HTML代码如下:

...
<ul id="sidebarmenu1">
<li><a href="Business">Business</a></li>
<li><a href="Warfare">Chinese</a></li>
</ul>
...

我用BeautifulSoup来解析这个文档。现在我想遍历这个列表里的元素。所以我使用了next_siblings这个属性,代码如下:

first_element = soup.ul.li
for items in soup.ul.li.next_siblings :
    <statements>

但是,这样做出现了以下错误:

TypeError: 'NoneType' object is not iterable

有没有人能告诉我怎么读取下一个li标签?因为显然在同一层级上还有另一个li标签,它应该在next_siblings列表里。

难道没有办法访问同一层级的所有li标签吗?findAll方法会返回所有嵌套在特定结构中的标签。

3 个回答

0

你可以这样做 -

main_list= soup.find('ul', attrs= {'id': 'sidebarmenu1'}
elements= main_list.findAll('li')
for link in elements:
    #do something
0

可以看看 这个解决方案。它使用了 findAll() 来处理嵌套的元素。

我不确定这是否完全符合你的需求,但这可能是个不错的起点。

1

借鉴了@elssar的回答,我用了这段代码:

main_list= soup.find('ul', attrs= {'id': 'sidebarmenu1'}
for li in main_list.findAll('li',attrs={},recursive=False):
    ul = li.find('ul')
    if ul == None :
        #do something
    else:
        navigate(ul)

其中,navigate(item) 是一个递归函数:

def navigate(item):
    for con in item.findAll('li',attrs={},recursive=False):
            ul = con.find('ul')
            if (ul == None):
                #do something
            else:
                navigate(ul)

撰写回答