用BeautifulSoup提取键的值

1 投票
1 回答
4380 浏览
提问于 2025-04-17 13:07

我想从类似这样的内容中提取“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)

我得到的结果是:一个字典对象没有属性内容

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

我什么都没得到。

最后我看到了一些信息:BeautifulSoup中attrMap和attrs的区别,还有:

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

找不到任何东西,必须是namecodearchive这些键的标签。

最后最后:

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 个回答

1

这里的问题是,archivo 不是 param 的一个属性,而是 value 属性里面的东西。要从 value 中提取出 archivo,我建议使用正则表达式,具体方法如下:

>>> 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']

撰写回答