【问题标题】:Get text of next sibling based on text of previous sibling根据前一个兄弟的文本获取下一个兄弟的文本
【发布时间】:2017-09-14 00:28:02
【问题描述】:

我有以下 HTML:

<div id="infoTable">
    <h4>
      User
    </h4>
    <table>
        <tbody>
            <tr>
                <td class="name">
                    <a href="/userpage/123">BillyBob12345</a>
                </td>
            </tr>
            <tr>
                <td class="name">
                    <a href="/userpage/124">JimBob43</a>
                </td>
            </tr>
        </tbody>
    </table>
    <h4>
      Super User
    </h4>
    <table>
        <tbody>
            <tr>
                <td class="name">
                    <a href="/userpage/112">CookieMonster</a>
                </td>
            </tr>
        </tbody>
    </table>
</div>

基本上,我希望得到两个列表:

Users = [{"BillyBob12345" : "123"}, {"JimBob43" : "124"}]
SuperUsers = [{"CookieMonster" : "112"}]

我目前正在使用 Python 2.7 和 BeautifulSoup4,我能够找到所有用户,但我无法将他们分成各自的组。

【问题讨论】:

    标签: python html parsing beautifulsoup nextsibling


    【解决方案1】:

    如果您碰巧知道它们是按这个顺序排列的,您可以使用列表推导式来创建这些字典列表,使用 .split('/') 解析“用户页”编号:

    firstTable = soup.findAll('table')[0]
    users = [{a.text : a['href'].split('/')[2]} for a in firstTable.findAll('a')]
    
    secondTable = soup.findAll('table')[1]
    superUsers = [{a.text : a['href'].split('/')[2]} for a in secondTable.findAll('a')]
    

    >>> users
    [{'BillyBob12345': '123'}, {'JimBob43': '124'}]
    >>> superUsers
    [{'CookieMonster': '112'}]
    

    如果您想访问名称“Users”然后将其用于字典,您可以使用:

    >>> firstTable.previousSibling.previousSibling
    <h4>
          User
        </h4>
    

    【讨论】:

    • 不幸的是,我不知道“超级用户”是否会出现在表格中。我希望做的是通过执行if (Credits.find('h4').text.strip() == "Super User"): 之类的操作来寻找“超级用户”,然后获取所有超级用户。或者,我不知道 CookieMonster 是用户还是超级用户,我只能基于 h4 标签。
    【解决方案2】:

    我实际上能够使用以下方法提取信息:

    if (BS.find('div').find('h4',text="User")):
        FindUsers = BS.find('div').find('h4', text="User").findNext('table').find('td', {"class" : "name"}).findAll('a')
        Users = [{u.text.strip() :  u['href'].split('/')[2]} for u in FindUsers ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      相关资源
      最近更新 更多