美丽汤:如何在<li> <div>


中提取
  • 信息。

    我正在尝试使用BeautifulSoup在div中提取li信息。

    以下是我正在使用的div的示例代码:

    <div class="list">
    <a href="/name1" target="_blank" title="name1">
    <img alt="name1" src="https://img.url.com/name1"/>
    <ul>
    <li>name1</li>
    <li>fullname1</li>
    </ul>
    </a>
    <a href="/name2" target="_blank" title="name2">
    <img alt="name2" src="https://img.url.com/name2"/>
    <ul>
    <li>name2</li>
    <li>fullname2</li>
    </ul>
    </a>
    <a href="/name3" target="_blank" title="name3">
    <img alt="name3" src="https://img.url.com/name3"/>
    <ul>
    <li>name3</li>
    <li>fullname3</li>
    </ul>
    </a>
    </div>
    

    我想做的是从两个li中提取"名称"和"全名"文本。

    我想我需要创建一个for循环来迭代列表,但我不确定如何做到这一点。(实际上,该列表比三个条目更长(。

    我遇到的另一个问题是如何让汤区分第一个<li>name<li>和第二个<li>fullname<li>标签。

    您的帮助将不胜感激!

    您可以将嵌套推导式与BeautifulSoup一起使用:

    from bs4 import BeautifulSoup as soup
    _div = soup(content, 'html.parser').find('div', {'class':'list'})
    results = [[i.text for i in b.find_all('li')] for b in _div.find_all('ul')]
    

    输出:

    [['name1', 'fullname1'], ['name2', 'fullname2'], ['name3', 'fullname3']]
    

    假设此div 中的列表将始终遵循上述格式,您可以通过选择器进行搜索。这将生成交替namesfullnames的列表。

    In [1]: from bs4 import BeautifulSoup as bs
    In [2]: soup = bs(html, 'html.parser')
    In [3]: target = soup.select('div ul li')
    # search by selector
    In [4]: target
    Out[4]:
    [<li>name1</li>,
    <li>fullname1</li>,
    <li>name2</li>,
    <li>fullname2</li>,
    <li>name3</li>,
    <li>fullname3</li>]
    In [5]: names = [n.text for n in target[::2]]
    # select every second element starting at the beginning of the list
    In [6]: names
    Out[6]: [u'name1', u'name2', u'name3']
    In [7]: fullnames = [f.text for f in target[1::2]]
    # select every second element starting at the second element of the list
    In [8]: fullnames
    Out[8]: [u'fullname1', u'fullname2', u'fullname3']