Python BeautifulSoup根据id提取标题

时间:2014-05-15 17:29:14

标签: python list beautifulsoup

这是这个问题的一个子问题:Python associate urls's ids and url's titles in lists

我有这个HTML脚本:

<a href="http://pluzz.francetv.fr/videos/monte_le_son_live_,101973832.html"
   class="ss-titre">Monte le son</a>
<div class="rs-cell-details">
    <a href="http://pluzz.francetv.fr/videos/monte_le_son_live_,101973832.html" 
       class="ss-titre">"Rubin_Steiner"</a>
    <a href="http://pluzz.francetv.fr/videos/fare_maohi_,102103928.html"
       class="ss-titre">Fare maohi</a>

如何使用BeautifulSoup获得此结果:

list_titre = [['Monte le son', 'Rubin_Steiner'], ['Fare maohi']]   #one sublist by id

我试过了:

f = urllib.urlopen(url)
page = f.read()
f.close()    
soup = BeautifulSoup(page)
show=[]
list_titre=[]
list_url=[]
for link in soup.findAll('a'):
    lien = link.get('href')
    if lien == None:
       lien = ""
    if "http://pluzz.francetv.fr/videos/" in lien:                 
       titre = (link.text.strip())
    if "Voir cette  vidéo" in titre:
       titre = ""
    if "Lire la vidéo" in titre:
       titre = ""
    list_titre.append(titre) 
    list_url.append(lien)

我的结果是:

list_titre = ['Monte le son', 'Rubin_Steiner', 'Fare maohi']
list_url = [http://pluzz.francetv.fr/videos/monte_le_son_live_,101973832.html, http://pluzz.francetv.fr/videos/fare_maohi_,102103928.html]

但“titre”未按ID排序。

1 个答案:

答案 0 :(得分:1)

使用CSS选择器搜索您的链接,以限制只有符合条件的网址。

按URL收集字典中的链接;这样,您就可以通过对字典键进行排序来处理信息:

from bs4 import BeautifulSoup

links = {}
soup = BeautifulSoup(page)

for link in soup.select('a[href^=http://pluzz.francetv.fr/videos/]'):
    title = link.get_text().strip()
    if title and title not in (u'Voir cette  vidéo', u'Lire la vidéo'):
        url = link['href']
        links.setdefault(url, []).append(title)

dict.setdefault()调用为尚未遇到的网址设置一个空列表;这会产生一个字典,其中URL作为键,标题作为每个URL的值列表。

演示:

>>> page = '''\
... <a href="http://pluzz.francetv.fr/videos/monte_le_son_live_,101973832.html"
...    class="ss-titre">Monte le son</a>
... <div class="rs-cell-details">
...     <a href="http://pluzz.francetv.fr/videos/monte_le_son_live_,101973832.html" 
...        class="ss-titre">"Rubin_Steiner"</a>
...     <a href="http://pluzz.francetv.fr/videos/fare_maohi_,102103928.html"
...        class="ss-titre">Fare maohi</a>
... '''
>>> links = {}
>>> soup = BeautifulSoup(page)
>>> for link in soup.select('a[href^=http://pluzz.francetv.fr/videos/]'):
...     title = link.get_text().strip()
...     if title and title not in (u'Voir cette  vidéo', u'Lire la vidéo'):
...         url = link['href']
...         links.setdefault(url, []).append(title)
... 
>>> from pprint import pprint
>>> pprint(links)
{'http://pluzz.francetv.fr/videos/ce_soir_ou_jamais_,101506826.html': [u'Ce soir (ou jamais !)',
                                                                       u'"Qui est propri\xe9taire de quoi ? La propri\xe9t\xe9 mise \xe0 mal dans tous les domaines"'],
 'http://pluzz.francetv.fr/videos/clip_locaux_,102890631.html': [u'Clips'],
 'http://pluzz.francetv.fr/videos/fare_maohi_,102152859.html': [u'Fare maohi'],
 'http://pluzz.francetv.fr/videos/fare_maohi_,102292937.html': [u'Fare maohi'],
 'http://pluzz.francetv.fr/videos/fare_maohi_,102365651.html': [u'Fare maohi'],
 'http://pluzz.francetv.fr/videos/inspecteur_barnaby_,101972045.html': [u'Inspecteur Barnaby',
                                                                        u'"La musique en h\xe9ritage"'],
 'http://pluzz.francetv.fr/videos/le_lab_o_saison3_,101215383.html': [u'Le Lab.\xd4',
                                                                      u'"Episode 22"',
                                                                      u'Saison 3'],
 'http://pluzz.francetv.fr/videos/monsieur_madame_saison1_,101970319.html': [u'Les Monsieur Madame',
                                                                             u'"Musique"',
                                                                             u'Saison 1'],
 'http://pluzz.francetv.fr/videos/monte_le_son_live_,101973832.html': [u'Monte le son !',
                                                                       u'"Rubin Steiner"'],
 'http://pluzz.francetv.fr/videos/music_explorer_saison1_,101215382.html': [u'Music Explorer : les chasseurs de sons',
                                                                            u'"Episode 3/6"',
                                                                            u'Saison 1'],
 'http://pluzz.francetv.fr/videos/retour_a_goree_,101641108.html': [u'Retour \xe0 Gor\xe9e'],
 'http://pluzz.francetv.fr/videos/singe_mi_singe_moi_,101507102.html': [u'Singe mi singe moi',
                                                                        u'"Le chat"'],
 'http://pluzz.francetv.fr/videos/singe_mi_singe_moi_,101777072.html': [u'Singe mi singe moi',
                                                                        u'"L\'autruche"'],
 'http://pluzz.francetv.fr/videos/toute_nouvelle_tendance_,102472310.html': [u'T.N.T'],
 'http://pluzz.francetv.fr/videos/toute_nouvelle_tendance_,102472336.html': [u'T.N.T'],
 'http://pluzz.francetv.fr/videos/toute_nouvelle_tendance_,102721018.html': [u'T.N.T'],
 'http://pluzz.francetv.fr/videos/toute_nouvelle_tendance_,103216774.html': [u'T.N.T.'],
 'http://pluzz.francetv.fr/videos/toute_nouvelle_tendance_,103216788.html': [u'T.N.T'],
 'http://pluzz.francetv.fr/videos/via_cultura_,101959892.html': [u'Via cultura',
                                                                 u'"L\'Ochju, le Mauvais oeil"']}