【问题标题】:Accessing Appended item with Beautiful Soup使用 Beautiful Soup 访问附加项目
【发布时间】:2016-02-01 01:28:44
【问题描述】:

我正在尝试使用 Beautiful Soup python 库将一些内容附加到 html 页面的正文中。

>>> from bs4 import BeautifulSoup
>>> doc = BeautifulSoup("<html><head></head><body></body></html>", "html.parser")
>>> body = BeautifulSoup("<ol><li>1</li><li>2</li></ol>", "html.parser")
>>> print doc.html.body.ol
None
>>> doc.html.body.append(body)
>>> print doc.html.body.ol
None

添加后,我仍然看到 ol 标记为空。

>>> body.ol
<ol><li>1</li><li>2</li></ol>
>>> doc.html.body
<body><ol><li>1</li><li>2</li></ol></body>
>>> 

但是。如果我打印整个正文标签,您可以看到内容似乎在那里。感觉append操作不是很懂。

编辑:

我不知道为什么,但似乎我可以附加标签但不能附加根。例如,doc.html.body.append(body.ol) 按我的预期工作。我也可以for tag in body.children: doc.html.body.append(tag)

我的问题是为什么根不追加?

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    您应该附加body.ol 而不是body。换句话说,追加一个Tag 实例而不是BeautifulSoup 实例:

    >>> from bs4 import BeautifulSoup
    >>> 
    >>> doc = BeautifulSoup("<html><head></head><body></body></html>", "html.parser")
    >>> body = BeautifulSoup("<ol><li>1</li><li>2</li></ol>", "html.parser")
    >>> 
    >>> doc.html.body.append(body.ol)
    >>> 
    >>> print(doc.html.body.ol)
    <ol><li>1</li><li>2</li></ol>
    

    或者,如果您不知道哪个标签将成为父标签,请使用body.find()

    您也可以将解析器切换为html5lib(需要html5lib to be installed):

    >>> from bs4 import BeautifulSoup
    >>> 
    >>> doc = BeautifulSoup("<html><head></head><body></body></html>", "html5lib")
    >>> body = BeautifulSoup("<ol><li>1</li><li>2</li></ol>", "html5lib")
    >>> 
    >>> doc.html.body.append(body)
    >>> print(doc.html.body.ol)
    <ol><li>1</li><li>2</li></ol>
    

    【讨论】:

    • 我仍然不明白追加的预期行为,因为解析器似乎不应该改变这种行为,因为此时它应该已经被“解析”了。看起来解决这个问题的方法是: for tag in body.children: doc.html.body.append(tag) 由于某种原因,根不会附加 html.parser跨度>
    • @rileymat 对最后一条评论感到抱歉,情况正好相反,但这并不完全相关 - 删除了评论。更新了答案,说明如何在不更改解析器的情况下使其工作。
    • 谢谢,在这个人为的例子中,我知道它下面是一个 ol 标签,但在我的实际应用中,我不知道它会是什么。遍历孩子似乎有效。将其更改为迭代,我会接受答案,因为它可能对某人有所帮助。不过,对于解析器来说,这是一个奇怪的区别。
    • @rileymat 是的,您可以使用 body.find() 来获取父元素..谢谢,目前尚不完全清楚发生了什么,我同意。
    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-10-09
    • 2021-08-13
    相关资源
    最近更新 更多