我想提取类似这样的“ 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']
一无所获,它必须是名称,代码或存档密钥的标记。
最后是:
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))
最佳答案
这里的问题是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']