python - 使用python根据标题标签自动生成嵌套目录

标签 python regex html-parsing nested-lists

我正在尝试创建一个基于 HTML 标题标签的嵌套目录。

我的 HTML 文件:

<html>
<head>
  <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
  <h1>
            My report Name
  </h1>
  <h1 id="2">First Chapter                          </h1>
  <h2 id="3"> First Sub-chapter of the first chapter</h2>
  <ul>
    <h1 id="text1">Useless h1</h1>
    <p>
      some text
    </p>
  </ul>
  <h2 id="4">Second Sub-chapter of the first chapter </h2>
  <ul>
    <h1 id="text2">Useless h1</h1>
    <p>
      some text
    </p>
  </ul>
  <h1 id="5">Second Chapter                          </h1>
  <h2 id="6">First Sub-chapter of the Second chapter </h2>
  <ul>
    <h1 id="text6">Useless h1</h1>
    <p>
      some text
    </p>
  </ul>
  <h2 id="7">Second Sub-chapter of the Second chapter </h2>
  <ul>
    <h1 id="text6">Useless h1</h1>
    <p>
      some text
    </p>
  </ul>
</body>
</html>

我的 python 代码:

import from lxml import html
from bs4 import BeautifulSoup as soup
import re
import codecs
#Access to the local URL(Html file)
f = codecs.open("C:\\x\\test.html", 'r')
page = f.read()
f.close()
#html parsing
page_soup = soup(page,"html.parser")
tree = html.fromstring(page)#extract report name
ref = page_soup.find("h1",{"id": False}).text.strip()
print("the name of the report is : " + ref + " \n")

chapters = page_soup.findAll('h1', attrs={'id': re.compile("^[0-9]*$")})
print("We have " + str(len(chapters)) + " chapter(s)")
for index, chapter in enumerate(chapters):
    print(str(index+1) +"-" + str(chapter.text.strip()) + "\n")

sub_chapters = page_soup.findAll('h2', attrs={'id': re.compile("^[0-9]*$")})
print("We have " + str(len(sub_chapters)) + " sub_chapter(s)")
for index, sub_chapter in enumerate(sub_chapters):
    print(str(index+1) +"-" +str(sub_chapter.text.strip()) + "\n")

使用这段代码,我可以获得所有章节和所有子章节,但这不是我的目标。

我的目标是将以下内容作为我的目录:

1-First Chapter
    1-First sub-chapter of the first chapter
    2-Second sub-chapter of the first chapter
2-Second Chapter    
    1-First sub-chapter of the Second chapter
    2-Second sub-chapter of the Second chapter

关于如何实现我想要的目录格式的任何建议或想法?

最佳答案

你可以在找到与每个章节相关的所有数据后使用itertools.groupby:

from itertools import groupby, count
import re
from bs4 import BeautifulSoup as soup
data = [[i.name, re.sub('\s+$', '', i.text)] for i in soup(content, 'html.parser').find_all(re.compile('h1|h2'), {'id':re.compile('^\d+$')})]
grouped, _count = [[a, list(b)] for a, b in groupby(data, key=lambda x:x[0] == 'h1')], count(1)
new_grouped = [[grouped[i][-1][0][-1], [c for _, c in grouped[i+1][-1]]] for i in range(0, len(grouped), 2)]
final_string = '\n'.join(f'{next(_count)}-{a}\n'+'\n'.join(f'\t{i}-{c}' for i, c in enumerate(b, 1)) for a, b in new_grouped)
print(final_string)

输出:

1-First Chapter
    1- First Sub-chapter of the first chapter
    2-Second Sub-chapter of the first chapter
2-Second Chapter
    1-First Sub-chapter of the Second chapter
    2-Second Sub-chapter of the Second chapter

关于python - 使用python根据标题标签自动生成嵌套目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55124236/

相关文章:

python - 如何正确处理 python 错误

ruby - 在Ruby中获取组在正则表达式中的值

java - 如何从 Jsoup 获取未格式化的 html

regex - Spring security 3 带索引的拦截url模式

perl - 解析 HTML 以获取两个集合元素之间的元素

c++ - 需要 C++ HTML 解析器 + 正则表达式支持

python - pytest 装置从外部范围重新定义名称 [pylint]

Python字典json

Python 组合 For 循环

jquery - 简单的正则表达式在 jQuery 中提取方括号之间的内容