2013-07-17 4 views
1

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

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 '*' 
+0

Ваш код работает для меня и печатает 10 '*' символов. – alecxe

+1

Попробуйте использовать парсер 'lxml' с beautifulsoup:' soup = BeautifulSoup (data, "lxml") '(убедитесь, что' lxml' установлен). – alecxe

+0

В этом случае, почему бы не использовать lxml напрямую? ^^ (шутка в сторону, у нее есть огромная поддержка xpath). – Ketouem

ответ

0

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

soup = BeautifulSoup(xmlData, 'xml') 
0

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

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

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

Да, я знал это. Но если я это сделаю, я не получу никакого. Поэтому я специально использовал нижние капители. – nikicc

Смежные вопросы