根据 h3 日期和关联的列表项修改 HTML

Modify HTML based on h3 date and associated list items

我是 Python 的新手,搞不懂这个。

我想要一个执行以下操作的脚本:

  1. 读取我的 HTML 文件
  2. 查找 h3 标签中昨天或更早的任何日期
  3. 删除所有不相关的内容

非常感谢任何见解 - 我已经搞砸了 BeautifulSoup 但我不确定我是否有正则表达式印章或知识将它们放在一起。

这是我的尝试,它成功地删除了 h3 标签之间昨天的日期,但我不知道如何处理与前面的 h3 标签关联的不同长度的列表项。

from datetime import datetime, timedelta
from bs4 import BeautifulSoup

# parse html
h = '''
<!doctype html>
<html>
<head>
<title>reprex</title>
</head>
<body>
<h3>05/20/2022</h3>
<ul>
    <li>apple</li>
    <li>banana</li>
    <li>cabbage</li>
</ul>

<h3>05/21/2022</h3>
<ul>
    <li>doritos</li>
    <li>eclairs</li>
    <li>fritos</li>
</ul>
</body>
</html>'''

soup = BeautifulSoup(h, 'html.parser')

# get yesterday's date
yesterday = (datetime.today() - timedelta(days = 1)).strftime('%m/%d/%Y') 

yesterday = str("<h3>" + yesterday + "</h3>")

soup = BeautifulSoup(str(soup).replace(yesterday, ""))

期望的输出:

<!doctype html>
<html>
<head>
<title>reprex</title>
</head>
<body>
<h3>05/21/2022</h3>
<ul>
    <li>doritos</li>
    <li>eclairs</li>
    <li>fritos</li>
</ul>
</body>
</html>

BeautifulSoup(一个 HTML 解析器)的全部意义在于使用其解析功能,而不是对原始文本使用 .replace()。

所以:

让我们找到所有的<h3>标签,对于每个不相关的标签,将其销毁,找到其相邻的<ul>并将其销毁。

使用 .decompose() 我们可以销毁元素

from datetime import datetime, timedelta, time
from bs4 import BeautifulSoup

# parse html
h = '''
<!doctype html>
<html>
<head>
<title>reprex</title>
</head>
<body>
<h3>05/20/2022</h3>
<ul>
    <li>apple</li>
    <li>banana</li>
    <li>cabbage</li>
</ul>

<h3>05/21/2022</h3>
<ul>
    <li>doritos</li>
    <li>eclairs</li>
    <li>fritos</li>
</ul>
</body>
</html>'''

soup = BeautifulSoup(h, 'html.parser')

today_midnight = datetime.combine(datetime.now(), time.min)  # Start of day

for el in soup.find_all("h3"): 
    date = el.text

   
    date = datetime.strptime(date,'%m/%d/%Y') 
    if date < today_midnight: 
        el.find_next_sibling('ul').decompose()
        el.decompose()
        

print (soup) # or soup.prettify() but that doesn't look so good.

为了测试这样的东西,我喜欢使用 random.randint

if random.randint(0,1)==1: 
        el.find_next_sibling('ul').decompose()
        el.decompose()