使用 BeautifulSoup 提取值列表

Swe*_*ike 3 python beautifulsoup html-parsing

我目前正在尝试使用 Ubuntu 的RSS feed自动解析 Ubuntu 的安全声明。我正在使用 feedparser,所以效果很好。我可以获得咨询的标题 (feed.title)、相关链接 (feed.link) 等等。

我现在想做的是进一步解析此输出,以便获取受影响的版本并将其存储以供进一步参考。

以下代码的作用是获取提要并为解析做好准备。它还使用 BeautifulSoup 来解析 feed.summary,这似乎是包含我想要的信息的“占位符”。

import feedparser
from bs4 import BeautifulSoup

ubuntu_url = 'https://usn.ubuntu.com/rss.xml'

feed = feedparser.parse(ubuntu_url)

for post in feed.entries:
    soup = BeautifulSoup(post.summary, 'html.parser')
Run Code Online (Sandbox Code Playgroud)

如果我添加“ print(soup.prettify())”,我可以在本节中看到我想要的信息(这是包含其他几个列表元素的更大输出的一部分):

<p>A security issue affects these releases of Ubuntu and its derivatives:</p>

<ul>
<li>Ubuntu 18.04 LTS</li>
<li>Ubuntu 17.10</li>
<li>Ubuntu 16.04 LTS</li>
<li>Ubuntu 14.04 LTS</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

当然,这个列表会有不同的长度,从只有一个版本向上。正如这个不同的例子所示:

<p>A security issue affects these releases of Ubuntu and its derivatives:</p>

<ul>
<li>Ubuntu 18.04 LTS</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我一直在试图弄清楚如何使用 BeautifulSoup 来解析它,并且只获取<ul> </ul>“安全问题影响 Ubuntu 及其衍生版本的这些版本:”标题之后的“ ”部分中的条目。

我一直在浏览文档,寻找使用“find_all”功能的正确方法,但现阶段还没有设法解决这个难题。

有什么想法吗?

提前致谢。

Rak*_*esh 5

使用副文本

演示:

from bs4 import BeautifulSoup
s = """<p>A security issue affects these releases of Ubuntu and its derivatives:</p>
<ul>
<li>Ubuntu 18.04 LTS</li>
<li>Ubuntu 17.10</li>
<li>Ubuntu 16.04 LTS</li>
<li>Ubuntu 14.04 LTS</li>
</ul>"""

soup = BeautifulSoup(s, "html.parser")
p_tag = soup.find("p", text="A security issue affects these releases of Ubuntu and its derivatives:")
for li in p_tag.find_next_siblings("ul")[0].find_all("li"):
    print(li.text)
Run Code Online (Sandbox Code Playgroud)

输出:

Ubuntu 18.04 LTS
Ubuntu 17.10
Ubuntu 16.04 LTS
Ubuntu 14.04 LTS
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您的更新版本。使用段落文本来完成它效果很好。下一关...;-) (2认同)