findAll() в BeautifulSoup отсутствуют узлы

Метод findAll() в BeautifulSoup не возвращает все элементы в XML. Если вы посмотрите на приведенный ниже код и откроете URL-адрес, вы увидите, что в XML есть 10 узлов PubmedArticle. Однако метод findAll находит только 6 из них. На выходе только 6* вместо 10. Что я делаю не так?

import urllib2
from bs4 import BeautifulSoup

URL = 'http://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&rettype=abstract&id=23858559,23858558,23858557,23858521,23858508,23858506,23858494,23858473,23858461,23858404'
data = urllib2.urlopen(URL).read()

soup = BeautifulSoup(data)

for x in soup.findAll('pubmedarticle'):
    print '*'

person nikicc    schedule 17.07.2013    source источник
comment
Ваш код работает для меня и печатает 10 символов *.   -  person alecxe    schedule 17.07.2013
comment
Попробуйте использовать парсер lxml с BeautifulSoup: soup = BeautifulSoup(data, "lxml") (убедитесь, что lxml установлен).   -  person alecxe    schedule 17.07.2013
comment
В таком случае, почему бы не использовать lxml напрямую? ^^ (шутка в сторону, у него потрясающая поддержка xpath).   -  person Ketouem    schedule 17.07.2013


Ответы (2)


Изменить: я обнаружил, что «findAll» относится к текущему узлу, вы можете установить корневой узел с супом.

Сущности в предоставленном xml называются "PubMedArticle", поэтому попробуйте следующее:

for x in soup.pubmedarticleset.findAll('pubmedarticle'):
    print '*'
person Ketouem    schedule 17.07.2013
comment
Да, я знал это. Но если я это сделаю, я ничего * не получу. Поэтому я намеренно использовал заглавные буквы. - person nikicc; 17.07.2013

Я решил это, добавив аргумент xml. Убедитесь, что у вас установлен lxml.

soup = BeautifulSoup(xmlData, 'xml')
person nikicc    schedule 19.07.2013