2013-03-18 89 views
0

後無法訪問屬性我試圖在BBC網站上抓取像this one這樣的網站來抓取程序清單的相關部分,並且我剛開始使用BeautifulSoup來做到這一點。使用BeautifulSoup的findAll

與像部分的利息開始的部分:

<li about="/programmes/p013zzsl#segment" class="segment track" id="segmentevent-p013zzsm" typeof="po:MusicSegment"> 

<li about="/programmes/p014003v#segment" class="segment speech alt" id="segmentevent_p014003w" typeof="po:SpeechSegment"> 

什麼我目前做的是打開HTML爲soup,然後用soup.findAll(typeof=['po:MusicSegment', 'po:SpeechSegment'])讓我感興趣的部分的一個結果他們出現的順序。

我則想要做的是檢查部分是否是指po:MusicSegmentpo:SpeechSegment在HTML,看起來像:

<li about="/programmes/p01400m9#segment" class="segment track" id="segmentevent-p01400mb" typeof="po:MusicSegment"> <span class="artist-image"> <span class="depiction" rel="foaf:depiction"><img alt="" height="63" src="http://static.bbci.co.uk/programmes/2.54.3/img/thumbnail/artists_default.jpg" width="112"/></span> </span> <script type="text/javascript"> window.programme_data.tracklist.push({ segment_event_pid : "p01400mb", segment_pid : "p01400m9", playlist : "http://www.bbc.co.uk/programmes/p01400m9.emp" }); </script> <h3> <span rel="mo:performer"> <span class="artist no-image" property="foaf:name" typeof="mo:MusicArtist">Mala</span> </span> <span class="title" property="dc:title">Calle F</span> </h3></li> 

我想訪問與<li>相關的typeof屬性,但如果這一塊的HTML (作爲BS4標籤)被稱爲section,並且我輸入section.li,它返回None

需要注意的是,如果我這樣做,而不是section.img,我得到的東西回來:

<img alt="" height="63" src="http://static.bbci.co.uk/programmes/2.54.3/img/thumbnail/artists_default.jpg" width="112"/> 

,然後我可以做,例如section.img['height']找回u'63'

我要的是後話了section.li部分相似,所以section.li['typeof']給我po:MusicSegmentpo:SpeechSegment

當然,我可以簡單地互相轉換結果爲文本,然後做一個簡單的字符串搜索,但通過屬性搜索看起來更優雅。

回答

2

我會遍歷由findAll返回的列表:

soup = BeautifulSoup('<li about="/programmes/p013zzsl#segment" class="segment track" id="segmentevent-p013zzsm" typeof="po:MusicSegment"><li about="/programmes/p014003v#segment" class="segment speech alt" id="segmentevent_p014003w" typeof="po:SpeechSegment">') 

for elem in soup.findAll(typeof=['po:MusicSegment', 'po:SpeechSegment']): 
    print elem['typeof'] 

回報

po:MusicSegment 
po:SpeechSegment 

,然後有條件地實施你的其他任務:

if elem['typeof'] == 'po:MusicSegment' 
    do.something() 
elif elem['typeof'] == 'po:SpeechSegment': 
    do.something_else() 
+0

我結果存儲到一箇中間變量,然後處理它們;這種方法要簡單得多。 – 2013-03-19 21:06:19