在Python中从HTML项目符号列表中提取数据

2024-06-16 11:30:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有以下项目符号列表的html文档:

Body=<ul><li>Preconditions<ul><li>PC1</li><li>PC2</li></ul></li><li>Use Case Triggers<ul><li>T1</li><li>T2</li></ul></li><li>Postconditions<ul><li>PO1</li><li>PO2</li></ul></li></ul>

(另一种观点):

  • 先决条件
    • PC1
    • PC2
    • 用例触发器
      • T1
      • T2
        • 后决条件
          • PO1
          • PO2
          • 我正在尝试用Python编写一个函数,该函数将删除此列表并提取数据组。目标是将这些数据放入一个矩阵中,如下所示:

            [[Preconditions, PC1],[Preconditions, PC2],[Use Case Triggers, T1],[Use Case Triggers, T2],[Postconditions, PO1],[Postconditions,PO2]]
            

            另一个需要跨越的障碍是,无论ul和li元素的数量如何,我都需要生成这种矩阵

            感谢您的指导


Tags: 函数列表useliult1caset2
2条回答

一个很好的解析html-beautifulsoup的库。代码示例:

html = "<ul><li>Preconditions<ul><li>PC1</li><li>PC2</li></ul></li><li>Use Case Triggers<ul><li>T1</li><li>T2</li></ul></li><li>Postconditions<ul><li>PO1</li><li>PO2</li></ul></li></ul>"



from bs4 import BeautifulSoup

bs = BeautifulSoup(html, "html.parser")
uls = bs.findAll("ul")
for ul in uls:
    print(ul.findAll("li"))

您可以编写一个函数,该函数接受原始html并删除所有html标记

def cleanhtml(raw_html):
    cleanr = re.compile("<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});")
    cleantext = re.sub(cleanr, " ", raw_html)
    return cleantext

其他一些清洁剂选项:

  • cleanr = re.compile("<[A-Za-z\/][^>]*>")
  • cleanr = re.compile("<[^>]*>")
  • cleanr = re.compile("<\/?\w+\s*[^>]*?\/?>")

但是有一个更好更简单的方法来使用Beautifulsoup

from bs4 import BeautifulSoup
def clean_with_soup(url: str) -> str:
    r = requests.get(url).text
    soup = BeautifulSoup(r, "html.parser")
    return soup.get_text()

相关问题 更多 >