使用BeautifulSoup提取键的值

时间:2012-02-16 12:14:14

标签: python beautifulsoup findall getattr

我想提取" archivo"的价值。这样的关键:

...
<applet name="bla" code="Any.class" archive="Any.jar">
<param name="abc" value="space='1' archivo='bla.jpg'" </param>
<param name="def" value="space='2' archivo='bli.jpg'" </param>
<param name="jkl" value="space='3' archivo='blu.jpg'" </param>
</applet>
...

我想我需要一个带有[bla.jpg,bli.jpg,...]的列表,所以我尝试了以下选项:

inputTag = soup.findAll("param",{'value':'archivo'})

inputTag = soup.findAll(attrs={"value" : "archivo"})

inputTag = soup.findAll("archivo")

我总是得到一个空列表:[]

其他不成功的选项:

inputTag = soup.findAll("param",{"value" : "archivo"}.contents)

我得到的结果是:dict对象没有属性内容

inputTag = unicode(getattr(soup.findAll('archivo'), 'string', ''))

我一无所获。

最后我看到了:Difference between attrMap and attrs in beautifulSoup和:

for tag in soup.recursiveChildGenerator():
    print tag['archivo']

什么都不找,它必须是 name code archive 键的标记。

以及最后:

tag.attrs = [(key,value) for key,value in tag.attrs if key == 'archivo']

但tag.attrs什么也找不到


好的,在jcollado的帮助下,我可以通过这种方式获得列表:

imageslist = []
patron = re.compile(r"archivo='([\w\./]+)'")
for tag in soup.findAll('param'):
    if patron.search(tag['value']):
        imageslist.append(patron.search(tag['value']).group(1))

1 个答案:

答案 0 :(得分:1)

此处的问题是archivo不是param的属性,而是value属性中的内容。要从archivo中提取value,我建议使用正则表达式,如下所示:

>>> archivo_regex = re.compile(r"archivo='([\w\./]+)'")
>>> [archivo_regex.search(tag['value']).group(1)
... for tag in soup.findAll('param')]
[u'bla.jpg', u'bli.jpg', u'blu.jpg']