【发布时间】:2023-03-04 08:37:02
【问题描述】:
以下代码未按预期工作:
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 的问题是编码问题?
我在 Python 3.7.6 中使用我认为是最新的 BeautifulSoup (4.8.2) 和 LXML (4.5.0)
【问题讨论】:
-
为您的解析器尝试“lxml-xml”。
-
来自 BeautifulSoup 文档的解析器部分:
xml’s HTML parser BeautifulSoup(markup, "lxml")。 -
@AMC 在我的回答中引用,它严格使用 lxml 库来解析 HTML。你需要使用 lxml-xml。
-
@David 抱歉,如果我的评论不清楚,我的意思是指出 OP 当前使用的
"lxml"用于解析 HTML,而不是 XML。
标签: python xml beautifulsoup