0

我正在尝试在 BBC 网站上抓取类似这样 的网站,以获取节目列表的相关部分,而我刚刚开始使用 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">

到目前为止,我所做的是打开 HTML soup,然后用于soup.findAll(typeof=['po:MusicSegment', 'po:SpeechSegment'])给出我感兴趣的部分的 ResultSet,它们的出现顺序。

然后我想要做的是检查一个部分是否引用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>

我想访问与typeof关联的属性<li>,但是如果调用了这段 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

当然,我可以简单地将每个结果转换为文本,然后进行简单的字符串搜索,但按属性搜索似乎更优雅。

4

1 回答 1

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()
于 2013-03-18T19:54:43.777 回答