Beautifulsoup неправильно анализирует тег xml, но l xml - PullRequest
1 голос
/ 08 февраля 2020

Следующий код не работает должным образом:

import requests
from bs4 import BeautifulSoup
url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi?retmode=xml&db=pmc'

response = requests.get(url)

soup = BeautifulSoup(response.text,'lxml')
links =  soup.find_all('link')

результат links дает набор `тегов (показаны только некоторые):

<link/>
<name>pmc_sra</name>
<menu>SRA</menu>
<description>Links to SRA</description>
<dbto>sra</dbto>
<link/>
<name>pmc_structure</name>
<menu>Structure Links</menu>
<description>Published 3D structures</description>
<dbto>structure</dbto>
<link/>

Печать response.text показывает (показывается только частичная печать):

<Link>
    <Name>pmc_sra</Name>
    <Menu>SRA</Menu>
    <Description>Links to SRA</Description>
    <DbTo>sra</DbTo>
</Link>
<Link>
    <Name>pmc_structure</Name>
    <Menu>Structure Links</Menu>
    <Description>Published 3D structures</Description>
    <DbTo>structure</DbTo>
</Link>
<Link>

Важно, что каждый тег Link содержит другие теги, тогда как Beautifulsoup предлагает использовать теги ссылок отдельно.

Если я попытаюсь lxml непосредственно, я получаю правильные теги ссылки:

from lxml import etree
#root = etree.fromstring(response.text)
root = etree.fromstring(response.text.encode('utf-8'),parser=etree.XMLParser(encoding='utf-8'))

for link in root.iter("Link"):
    etree.dump(link)

производит:

<Link>
    <Name>pmc_sra</Name>
    <Menu>SRA</Menu>
    <Description>Links to SRA</Description>
    <DbTo>sra</DbTo>
</Link>

<Link>
    <Name>pmc_structure</Name>
    <Menu>Structure Links</Menu>
    <Description>Published 3D structures</Description>
    <DbTo>structure</DbTo>
</Link>

Обратите внимание, я получил ошибку с более простым вызовом etree.fromstring. Возможно, проблема с BeautifulSoup - это проблема кодирования?

Я использую то, что я считаю новейшими BeautifulSoup (4.8.2) и L XML (4.5.0) в Python 3.7.6

1 Ответ

1 голос
/ 08 февраля 2020

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing -a-parser

Я полагаю, что проблема заключается в использовании "l xml" против "l xml - xml". Если я прав, Beautiful Soup пытается проанализировать ваш XML как HTML и, следовательно, исказить данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...