【问题标题】:Extracting data from HTML bulleted lists in Python从 Python 中的 HTML 项目符号列表中提取数据
【发布时间】:2020-07-31 19:32:50
【问题描述】:

我有一个带有以下项目符号列表的 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 元素的数量如何,我都需要生成这种矩阵。

感谢任何指导!

【问题讨论】:

标签: python html


【解决方案1】:

你可以编写一个函数,获取原始 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("&lt;[A-Za-z\/][^&gt;]*&gt;")
  • cleanr = re.compile("&lt;[^&gt;]*&gt;")
  • cleanr = re.compile("&lt;\/?\w+\s*[^&gt;]*?\/?&gt;")

但是使用 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()

【讨论】:

    【解决方案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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2012-08-09
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2011-08-22
      • 2021-03-22
      相关资源
      最近更新 更多