2017-02-11 8 views
3

Я проанализировал HTML-страницу через beautifulsoup, извлекая все элементы div с конкретными именами class в список.Обработка списка Python для извлечения подстрок

Теперь мне нужно очистить 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
  1. Не конвертируйте объект BS в строку, если вам действительно не нужно это делать.
  2. селектор
  3. Используйте CSS, чтобы найти class, который начинается с info
  4. Используйте stripped_strings, чтобы получить все непустые строки под тегом
  5. Использование tuple() для преобразования итератор в кортеж объект

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) 

out:

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

Это просто здорово. Огромное спасибо :-) –