根据 h3 日期和关联的列表项修改 HTML
Modify HTML based on h3 date and associated list items
我是 Python 的新手,搞不懂这个。
我想要一个执行以下操作的脚本:
- 读取我的 HTML 文件
- 查找 h3 标签中昨天或更早的任何日期
- 删除所有不相关的内容
非常感谢任何见解 - 我已经搞砸了 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()
我是 Python 的新手,搞不懂这个。
我想要一个执行以下操作的脚本:
- 读取我的 HTML 文件
- 查找 h3 标签中昨天或更早的任何日期
- 删除所有不相关的内容
非常感谢任何见解 - 我已经搞砸了 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()