Извлечение значения ключа с BeautifulSoup - PullRequest
1 голос
/ 16 февраля 2012

Я хочу извлечь значение ключа "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', ''))

Я ничего не получаю.

Наконец я увидел: Разница между attrMap и attrs в 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))

1 Ответ

1 голос
/ 16 февраля 2012

Проблема здесь в том, что 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']
...