【问题标题】:Beautiful Soup find_all() returns odd tags instead of resultsBeautiful Soup find_all() 返回奇数标签而不是结果
【发布时间】:2014-11-29 21:58:41
【问题描述】:

我正在使用 Beautiful Soup 从如下所示的 XML 文件中获取一些信息:

<name>Ted</name>
<link>example.com/rss</link>
<link>example2.com/rss</link>

这是我目前尝试读取的整个 XML 文件,用于测试目的。

当我尝试使用 find_all('link') 时,它会返回一个包含以下内容的列表:

[ <link/>, <link/> ]

我似乎在任何文档中都找不到类似的内容,谁能告诉我我做错了什么?

编辑:包括解析代码:

for file in glob.glob("*.xml"):
            if file.endswith(".xml"):
                    f = open(file, 'r');

                    #Reads in all information about the bot from the file
                    botFile = f.read()
                    soup = BeautifulSoup(botFile)

                    name = soup.find('name').get_text()

                    links = soup.find_all('link')
                    for link in links:
                            print link

【问题讨论】:

  • 你是如何用 BeautifulSoup 解析 XML 的?请向我们展示您的代码。
  • 我已经编辑了原始帖子以包含代码。如果有帮助,从汤中检索名称就可以了。
  • 旁注:我很确定file.endswith(".xml") 检查是不必要的。
  • 就像f.read() 电话一样; soup = BeautifulSoup(f) 也可以。

标签: python xml beautifulsoup


【解决方案1】:

要使用 BeautifulSoup 解析 XML,您需要使用 XML 解析器;确保你有 lxml installed 并告诉 BeautifulSoup 使用 XML:

soup = BeautifulSoup(document, 'xml')

否则元素将被解析为HTML &lt;link&gt; tags,定义为空。

演示:

>>> from bs4 import BeautifulSoup
>>> sample = '''\
... <root>
... <name>Ted</name>
... <link>example.com/rss</link>
... <link>example2.com/rss</link>
... </root>
... '''
>>> soup = BeautifulSoup(sample)
>>> soup.find_all('link')
[<link/>, <link/>]
>>> soup = BeautifulSoup(sample, 'xml')
>>> soup.find_all('link')
[<link>example.com/rss</link>, <link>example2.com/rss</link>]

请注意,如果没有第二个参数'xml',结果是空标记对象,但设置'xml',标记内容就在那里。

请参阅文档中的 Installing a parserParsing XML

【讨论】:

    【解决方案2】:

    Beautiful Soup 文档提到它无法正确处理 xml 文件。有一个名为 BeautifulStoneSoup 的模块可以处理 xml 文件。它是一个基本模块,没有什么花哨的。但是,如果您的文件是一个简单的 xml,那么它可能会很好地完成这项工作。 这是其文档的link

    【讨论】:

    • 这适用于 BeautifulSoup 版本 3,该版本已在多年前被封存。此处 OP 使用的版本 4 可以很好地处理 XML,前提是您使用正确的解析器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2021-05-09
    • 2016-01-13
    相关资源
    最近更新 更多