【问题标题】:beautifulsoup not parsing xml tag correctly but lxml isbeautifulsoup 没有正确解析 xml 标签,但 lxml 是
【发布时间】: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


【解决方案1】:

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

我认为问题在于使用“lxml”与“lxml-xml”。如果我是正确的,Beautiful Soup 正在尝试将您的 XML 解析为 HTML 并因此修改数据。

【讨论】:

  • 我已经多次查看该页面并完全确定“lxml”不是xml!?!?这对我来说几乎像是一个错误,尽管也许有理由保持这种行为?当然,如果不是“链接”标签,我也会侥幸逃脱,它在 html 中是自动关闭的!谢谢。
  • @Jimbo 不幸的是,通往 BeautifulSoup 的大多数道路都试图解析错误的 HTML,因此默认解析器不是“lxml-html”。当我看到您损坏的链接标签时,我就知道这是问题所在,但我一直认为 BS 在幕后做了某种魔术,并且不需要通过“lxml-xml”明确地“不认真地解析 XML”。
  • 是的,我真的很好奇如果让 BeautifulSoup 将 xml 解析为 html 对任何人有用。如果您传入部分页面,我可以理解,因此 BeautifulSoup 可能不确定它看到的是什么,但是当开始标签字面上是 &lt;xml 时,强制所有标签呈现 html 行为似乎很奇怪。哦,好吧,从小写标签切换到大写标签只花了大约 30 分钟!再次感谢。
猜你喜欢
  • 2016-05-30
  • 2013-11-19
  • 2013-08-29
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多