使用BeautifulSoup

时间:2018-07-24 10:32:07

标签: python beautifulsoup html-parsing

我目前正在尝试使用其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')

如果我添加一个'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>

当然,此列表的长度会有所不同,从一个版本开始一直到一个版本。如以下示例所示:

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

<ul>
<li>Ubuntu 18.04 LTS</li>
</ul>

我一直在试图找出如何使用BeautifulSoup解析此问题的方法,并且仅在“安全问题影响Ubuntu及其衍生版本的这些版本:”标题之后才抓取“ <ul> </ul>”部分中的条目。 。

我一直在寻找文档中使用'find_all'功能的正确方法,但是在这一阶段还没有设法解决难题。

那里有什么主意吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

使用文字

演示:

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)

输出:

Ubuntu 18.04 LTS
Ubuntu 17.10
Ubuntu 16.04 LTS
Ubuntu 14.04 LTS

答案 1 :(得分:2)

只需使用

a = soup.findAll('li')
for b in a:
    print(b)