用于提取子字符串的Python列表处理

时间:2017-02-11 08:53:55

标签: python beautifulsoup

我通过beautifulsoup解析了一个HTML页面,将具有特定div名称的所有class元素提取到一个列表中。

我现在必须清除此列表中的HTML字符串,留下我需要的字符串标记。

我开始的列表如下所示:

[<div class="info-1">\nName1a    <span class="bold">Score1a</span>\n</div>, <div class="info-2">\nName1b    <span class="bold">Score1b</span>\n</div>, <div class="info-1">\nName2a    <span class="bold">Score2a</span>\n</div>, <div class="info-2">\nName2b    <span class="bold">Score2b</span>\n</div>, <div class="info-1">\nName3a    <span class="bold">Score3a</span>\n</div>, <div class="info-2">\nName3b    <span class="bold">Score3b</span>\n</div>]

空白是故意的。 我需要将该列表缩减为:

[('Name1a', 'Score1a'), ('Name1b', 'Score1b'), ('Name2a', 'Score2a'), ('Name2b', 'Score2b'), ('Name3a', 'Score3a'), ('Name3b', 'Score3b')]

什么是解析像这样的子串的有效方法?

我已尝试使用split方法(例如[item.split('<div class="info-1">\n',1) for item in string_list]),但拆分只会导致需要进一步拆分的子字符串(因此效率低下)。同样使用replace

我觉得我应该走另一条路并提取我需要的令牌,但我似乎无法用优雅的方式绕过去做这件事。对此不熟悉也没有帮助。我恭维你的帮助。

1 个答案:

答案 0 :(得分:1)

  1. 除非你真的需要这样做,否则不要将BS对象转换为字符串。
  2. 使用CSS选择器查找以class
  3. 开头的info
  4. 使用stripped_strings获取标记
  5. 下的所有非空字符串
  6. 使用tuple()将可迭代对象转换为元组对象
  7. import bs4
    
    html = '''<div class="info-1">\nName1a    <span class="bold">Score1a</span>\n</div>, <div class="info-2">\nName1b    <span class="bold">Score1b</span>\n</div>, <div class="info-1">\nName2a    <span class="bold">Score2a</span>\n</div>, <div class="info-2">\nName2b    <span class="bold">Score2b</span>\n</div>, <div class="info-1">\nName3a    <span class="bold">Score3a</span>\n</div>, <div class="info-2">\nName3b    <span class="bold">Score3b</span>\n</div>'''
    
    soup = bs4.BeautifulSoup(html, 'lxml')
    
    for div in soup.select('div[class^="info"]'):
        t = tuple(text for text in div.stripped_strings)
        print(t)
    

    出:

    ('Name1a', 'Score1a')
    ('Name1b', 'Score1b')
    ('Name2a', 'Score2a')
    ('Name2b', 'Score2b')
    ('Name3a', 'Score3a')
    ('Name3b', 'Score3b')