2017-02-11 72 views
3

我通過beautifulsoup解析HTML頁面,提取所有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. 使用CSS選擇器來查找與info
  3. 使用stripped_strings開始class得到一個標籤
  4. 使用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) 

出:

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

這下好了。謝謝一堆:-) –