如何使用BeautifulSoup从多个兄弟姐妹那里收集信息?

时间:2014-09-14 01:11:55

标签: python beautifulsoup

这是我正在使用的html:

<a 'data' = 'ubr_app'>List</a>
    <ul>
        <li>
            'a'
        </li>
        <li>
            'b'
        </li>
        <li>
            'c'
        </li>
    <ul>
        <li>
            1
        </li>
        <li>
            2
        </li>
        <li>
            3
        </li>

我想将这些列表中的所有信息存储在单独的数组中。我在python中所做的是以下内容:

def getItems(soup):
    item1_list = []
    item2_list = []
    appliance = soup.find('a', {'data-lid' : 'ubr_app'})
    appliance_ul = appliance.parent.find_next_sibling() # go to 1st <ul> sibling
    for item in appliance_ul.find_all('li'):
        item1_list.append(item.text)

    appliance_ul = appliance_ul.find_next_sibling() # go to 2nd <ul> sibling
    for item in appliance_ul.find_all('li'):
        item2_list.append(item.text)
    return item1_list, item2_list

这给了我['a','b','c']和[1,2,3]。 这就是我想要做的,但它是非常静态的,看起来像丑陋的代码。有没有办法只搜索所有现有的'ul'兄弟姐妹,这样我就可以将信息保存在每个嵌套列表中?

1 个答案:

答案 0 :(得分:0)

使用.find_next_siblings() (plural)而不是使用.find_next_sibling(),并为其提供过滤器:

def getItems(soup):
    items = []
    appliance = soup.select('a[data-lid="ubr_app"]')[0]
    for appliance_ul in appliance.parent.find_next_siblings('ul'):
        items.append([i.text for i in appliance_ul.find_all('li')])
    return items

.find_next_siblings('ul')调用会返回所有<ul>兄弟代码的列表。