Goal: I want to merge html files from an epub into a single html document. I also want working links, so I need to ensure that the hrefs and relevant tag id's are defined properly to work within the document
import os
import glob
from bs4 import BeautifulSoup
I have already unzipped an epub document into the folder epub
in the same directory
# collect all html files in outer and inner directories
directory = './epub'
outer_html_files = glob.glob(os.path.join(directory, '*.xhtml'))
inner_directory = './epub/text'
inner_html_files = glob.glob(os.path.join(inner_directory, '*.html'))
# the ordering depends heavily on what you have
outer_html_files = outer_html_files[::-1]
inner_html_files = sorted(inner_html_files)
html_files = outer_html_files + inner_html_files
# let us look at a sample html
with open(html_files[2], 'r', encoding='utf-8') as file:
soup = BeautifulSoup(file, 'html.parser')
# get all tags
soup.find_all(id=True)
[<body class="calibre" id="0-9d088d4ffd7e4135ab987c63f18099d5"> <div class="titlehead">Frank Herbert's Dune Saga Collection: Books 1 - 6</div> <div class="titletext">Dune</div> <div class="titletext">Dune Messiah</div> <div class="titletext">Children of Dune</div> <div class="titletext">God Emperor of Dune</div> <div class="titletext">Heretics of Dune</div> <div class="titletext">Chapterhouse: Dune</div> <div class="titleauthor">Frank Herbert</div> </body>]
# get the id of the body
soup.find('body').get('id')
'0-9d088d4ffd7e4135ab987c63f18099d5'
output_doc = BeautifulSoup()
output_doc.append(output_doc.new_tag("html"))
output_doc.html.append(output_doc.new_tag("body"))
Problem: when just getting appending the body, all the body tags get consolidated into one large outer body tag, so the id's disappear.
The solution is to create a new div for each html file, then append the body to the div and then append the div into the output document
# read 2 files
for file in html_files[3:4+1]:
with open(html_files[3], 'r', encoding='utf-8') as file:
soup = BeautifulSoup(file, 'html.parser')
body_content = soup.find('body')
# the trick to preserve the body tag is to hide the body in a div
div = output_doc.new_tag('div', id=(body_content.get('id')))
div.append(body_content.extract())
output_doc.append(div)
print(output_doc.prettify())
<html> <body> </body> </html> <div id="UGI0-9d088d4ffd7e4135ab987c63f18099d5"> <body class="calibre" id="UGI0-9d088d4ffd7e4135ab987c63f18099d5"> <h1 class="contents-head" id="calibre_pb_0"> Table of Contents </h1> <p class="contents-fl"> <i class="calibre1"> <a class="calibre2" href="kindle:embed:0001?mime=image/jpg"> Cover </a> </i> </p> <p class="contents-fl"> <i class="calibre1"> <a class="calibre2" href="part0000.html#0-9d088d4ffd7e4135ab987c63f18099d5"> Title Page </a> </i> </p> <p class="contents-fl"> </p> <div class="contents-fl"> <a class="calibre2" href="part0004.html#3Q280-9d088d4ffd7e4135ab987c63f18099d5"> Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0069.html#21PMQ0-9d088d4ffd7e4135ab987c63f18099d5"> Dune Messiah </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0101.html#30A8Q0-9d088d4ffd7e4135ab987c63f18099d5"> Children of Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0172.html#5410O0-9d088d4ffd7e4135ab987c63f18099d5"> God Emperor of Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0232.html#6T82G0-9d088d4ffd7e4135ab987c63f18099d5"> Heretics of Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0284.html#8EQVO0-9d088d4ffd7e4135ab987c63f18099d5"> Chapterhouse: Dune </a> </div> </body> </div> <div id="UGI0-9d088d4ffd7e4135ab987c63f18099d5"> <body class="calibre" id="UGI0-9d088d4ffd7e4135ab987c63f18099d5"> <h1 class="contents-head" id="calibre_pb_0"> Table of Contents </h1> <p class="contents-fl"> <i class="calibre1"> <a class="calibre2" href="kindle:embed:0001?mime=image/jpg"> Cover </a> </i> </p> <p class="contents-fl"> <i class="calibre1"> <a class="calibre2" href="part0000.html#0-9d088d4ffd7e4135ab987c63f18099d5"> Title Page </a> </i> </p> <p class="contents-fl"> </p> <div class="contents-fl"> <a class="calibre2" href="part0004.html#3Q280-9d088d4ffd7e4135ab987c63f18099d5"> Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0069.html#21PMQ0-9d088d4ffd7e4135ab987c63f18099d5"> Dune Messiah </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0101.html#30A8Q0-9d088d4ffd7e4135ab987c63f18099d5"> Children of Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0172.html#5410O0-9d088d4ffd7e4135ab987c63f18099d5"> God Emperor of Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0232.html#6T82G0-9d088d4ffd7e4135ab987c63f18099d5"> Heretics of Dune </a> </div> <div class="contents-fl"> <a class="calibre2" href="part0284.html#8EQVO0-9d088d4ffd7e4135ab987c63f18099d5"> Chapterhouse: Dune </a> </div> </body> </div>
Notice how the body
is preserved from each html file
The available id with the original id name allows hrefs to reach this section of the document.
However, notice that the hrefs have the name "partX.html#id".
Let's try to find all the href variants
output_doc = BeautifulSoup()
output_doc.append(output_doc.new_tag("html"))
output_doc.html.append(output_doc.new_tag("body"))
for file in html_files:
with open(file, 'r') as html_file:
soup = BeautifulSoup(html_file, "html.parser")
body_content = soup.find('body')
# the trick to preserve the id is to hide the body in a div with the same id
div = output_doc.new_tag('div', id=body_content.get('id'))
div.append(body_content.extract())
output_doc.append(div)
href_list = [ link.get('href') for link in output_doc.find_all('a')]
href_list
['text/part0000.html#0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0001.html#UGI0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0002.html#x9781101157879_EPUB', 'text/part0003_split_000.html#x9781101157879_EPUB-1', 'text/part0004.html#3Q280-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0005.html#4OIQ0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0006.html#5N3C0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0007.html#6LJU0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0008.html#7K4G0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0009.html#8IL20-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0010.html#9H5K0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0011.html#AFM60-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0012.html#BE6O0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0013.html#CCNA0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0014.html#DB7S0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0015.html#E9OE0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0016.html#F8900-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0017.html#G6PI0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0018.html#H5A40-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0019.html#I3QM0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0020.html#J2B80-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0021.html#K0RQ0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0022.html#KVCC0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0023.html#LTSU0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0024.html#MSDG0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0025.html#NQU20-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0026.html#OPEK0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0027.html#PNV60-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0028.html#QMFO0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0029.html#RL0A0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0030.html#SJGS0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0031.html#TI1E0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0032.html#UGI00-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0033.html#VF2I0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0034.html#10DJ40-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0035.html#11C3M0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0036.html#12AK80-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0037.html#1394Q0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0038.html#147LC0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0039.html#1565U0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0040.html#164MG0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0041.html#173720-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0042.html#181NK0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0043.html#190860-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0044.html#19UOO0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0045.html#1AT9A0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0046.html#1BRPS0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0047.html#1CQAE0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0048.html#1DOR00-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0049.html#1ENBI0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0050.html#1FLS40-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0051.html#1GKCM0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0052.html#1HIT80-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0053.html#1IHDQ0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0054.html#1JFUC0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0055.html#1KEEU0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0056.html#1LCVG0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0057.html#1MBG20-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0058.html#1NA0K0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0059.html#1O8H60-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0061.html#1Q5IA0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0062.html#1R42S0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0063.html#1S2JE0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0064.html#1T1400-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0065.html#1TVKI0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0066.html#1UU540-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0067.html#1VSLM0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0068.html#20R680-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0069.html#21PMQ0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0070.html#x9781101157879_EPUB-4', 'text/part0071.html#x9781101157879_EPUB-2', 'text/part0072.html#24L8G0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0073.html#x9781101157879_EPUB-3', 'text/part0074.html#x9781101157879_EPUB-5', 'text/part0075.html#x9781101157879_EPUB-6', 'text/part0076.html#x9781101157879_EPUB-7', 'text/part0077.html#x9781101157879_EPUB-8', 'text/part0078.html#x9781101157879_EPUB-9', 'text/part0079.html#x9781101157879_EPUB-10', 'text/part0080.html#x9781101157879_EPUB-11', 'text/part0081.html#x9781101157879_EPUB-12', 'text/part0082.html#x9781101157879_EPUB-13', 'text/part0083.html#x9781101157879_EPUB-14', 'text/part0084.html#x9781101157879_EPUB-15', 'text/part0085.html#x9781101157879_EPUB-16', 'text/part0086.html#x9781101157879_EPUB-17', 'text/part0087.html#x9781101157879_EPUB-18', 'text/part0088.html#x9781101157879_EPUB-19', 'text/part0089.html#x9781101157879_EPUB-20', 'text/part0090.html#x9781101157879_EPUB-21', 'text/part0091.html#x9781101157879_EPUB-22', 'text/part0092.html#x9781101157879_EPUB-23', 'text/part0093.html#x9781101157879_EPUB-24', 'text/part0094.html#x9781101157879_EPUB-25', 'text/part0095.html#x9781101157879_EPUB-26', 'text/part0096.html#x9781101157879_EPUB-27', 'text/part0097.html#x9781101157879_EPUB-28', 'text/part0098.html#x9781101157879_EPUB-29', 'text/part0099.html#x9781101157879_EPUB-30', 'text/part0101.html#30A8Q0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0102.html#x9781440630514_EPUB-2', 'text/part0103.html#x9781440630514_EPUB-3', 'text/part0104.html#x9781440630514_EPUB-4', 'text/part0105.html#344B20-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0106.html#x9781440630514_EPUB-5', 'text/part0107.html#x9781440630514_EPUB-6', 'text/part0108.html#x9781440630514_EPUB-7', 'text/part0109.html#x9781440630514_EPUB-8', 'text/part0110.html#x9781440630514_EPUB-9', 'text/part0111.html#x9781440630514_EPUB-10', 'text/part0112.html#x9781440630514_EPUB-11', 'text/part0113.html#x9781440630514_EPUB-12', 'text/part0114.html#x9781440630514_EPUB-13', 'text/part0115.html#x9781440630514_EPUB-14', 'text/part0116.html#x9781440630514_EPUB-15', 'text/part0117.html#x9781440630514_EPUB-16', 'text/part0118.html#x9781440630514_EPUB-17', 'text/part0119.html#x9781440630514_EPUB-18', 'text/part0120.html#x9781440630514_EPUB-19', 'text/part0121.html#x9781440630514_EPUB-20', 'text/part0122.html#x9781440630514_EPUB-21', 'text/part0123.html#x9781440630514_EPUB-22', 'text/part0124.html#x9781440630514_EPUB-23', 'text/part0125.html#x9781440630514_EPUB-24', 'text/part0126.html#x9781440630514_EPUB-25', 'text/part0127.html#x9781440630514_EPUB-26', 'text/part0128.html#x9781440630514_EPUB-27', 'text/part0129.html#x9781440630514_EPUB-28', 'text/part0130.html#x9781440630514_EPUB-29', 'text/part0131.html#x9781440630514_EPUB-30', 'text/part0132.html#x9781440630514_EPUB-31', 'text/part0133.html#x9781440630514_EPUB-32', 'text/part0134.html#x9781440630514_EPUB-33', 'text/part0135.html#x9781440630514_EPUB-34', 'text/part0136.html#x9781440630514_EPUB-35', 'text/part0137.html#x9781440630514_EPUB-36', 'text/part0138.html#x9781440630514_EPUB-37', 'text/part0139.html#x9781440630514_EPUB-38', 'text/part0140.html#x9781440630514_EPUB-39', 'text/part0141.html#x9781440630514_EPUB-40', 'text/part0142.html#x9781440630514_EPUB-41', 'text/part0143.html#x9781440630514_EPUB-42', 'text/part0144.html#x9781440630514_EPUB-43', 'text/part0145.html#x9781440630514_EPUB-44', 'text/part0146.html#x9781440630514_EPUB-45', 'text/part0147.html#x9781440630514_EPUB-46', 'text/part0148.html#x9781440630514_EPUB-47', 'text/part0149.html#x9781440630514_EPUB-48', 'text/part0150.html#x9781440630514_EPUB-49', 'text/part0151.html#x9781440630514_EPUB-50', 'text/part0152.html#x9781440630514_EPUB-51', 'text/part0153.html#x9781440630514_EPUB-52', 'text/part0154.html#x9781440630514_EPUB-53', 'text/part0155.html#x9781440630514_EPUB-54', 'text/part0156.html#x9781440630514_EPUB-55', 'text/part0157.html#x9781440630514_EPUB-56', 'text/part0158.html#x9781440630514_EPUB-57', 'text/part0159.html#x9781440630514_EPUB-58', 'text/part0160.html#x9781440630514_EPUB-59', 'text/part0161.html#x9781440630514_EPUB-60', 'text/part0162.html#x9781440630514_EPUB-61', 'text/part0163.html#x9781440630514_EPUB-62', 'text/part0164.html#x9781440630514_EPUB-63', 'text/part0165.html#x9781440630514_EPUB-64', 'text/part0166.html#x9781440630514_EPUB-65', 'text/part0167.html#x9781440630514_EPUB-66', 'text/part0168.html#x9781440630514_EPUB-67', 'text/part0169.html#x9781440630514_EPUB-68', 'text/part0170.html#x9781440630514_EPUB-69', 'text/part0171.html#x9781440630514_EPUB-70', 'text/part0172.html#5410O0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0173.html#x9781440631979_EPUB-2', 'text/part0174.html#x9781440631979_EPUB-3', 'text/part0175.html#x9781440631979_EPUB-4', 'text/part0176.html#57R300-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0177.html#x9781440631979_EPUB-5', 'text/part0179.html#x9781440631979_EPUB-7', 'text/part0182.html#x9781440631979_EPUB-10', 'text/part0183.html#x9781440631979_EPUB-11', 'text/part0184.html#x9781440631979_EPUB-12', 'text/part0185.html#x9781440631979_EPUB-13', 'text/part0186.html#x9781440631979_EPUB-14', 'text/part0187_split_000.html#x9781440631979_EPUB-15', 'text/part0188.html#x9781440631979_EPUB-16', 'text/part0189_split_000.html#x9781440631979_EPUB-17', 'text/part0190.html#x9781440631979_EPUB-18', 'text/part0191.html#x9781440631979_EPUB-19', 'text/part0192.html#x9781440631979_EPUB-20', 'text/part0193.html#x9781440631979_EPUB-21', 'text/part0194.html#x9781440631979_EPUB-22', 'text/part0195.html#x9781440631979_EPUB-23', 'text/part0196_split_000.html#x9781440631979_EPUB-24', 'text/part0197.html#x9781440631979_EPUB-25', 'text/part0198.html#x9781440631979_EPUB-26', 'text/part0199.html#x9781440631979_EPUB-27', 'text/part0200.html#x9781440631979_EPUB-28', 'text/part0201.html#x9781440631979_EPUB-29', 'text/part0202.html#x9781440631979_EPUB-30', 'text/part0203.html#x9781440631979_EPUB-31', 'text/part0204.html#x9781440631979_EPUB-32', 'text/part0205.html#x9781440631979_EPUB-33', 'text/part0206.html#x9781440631979_EPUB-34', 'text/part0207.html#x9781440631979_EPUB-35', 'text/part0208.html#x9781440631979_EPUB-36', 'text/part0209.html#x9781440631979_EPUB-37', 'text/part0210.html#x9781440631979_EPUB-38', 'text/part0211.html#x9781440631979_EPUB-39', 'text/part0212.html#x9781440631979_EPUB-40', 'text/part0213.html#x9781440631979_EPUB-41', 'text/part0214.html#x9781440631979_EPUB-42', 'text/part0215.html#x9781440631979_EPUB-43', 'text/part0216.html#x9781440631979_EPUB-44', 'text/part0217.html#x9781440631979_EPUB-45', 'text/part0218.html#x9781440631979_EPUB-46', 'text/part0219.html#x9781440631979_EPUB-47', 'text/part0220.html#x9781440631979_EPUB-48', 'text/part0221.html#x9781440631979_EPUB-49', 'text/part0222.html#x9781440631979_EPUB-50', 'text/part0223.html#x9781440631979_EPUB-51', 'text/part0224.html#x9781440631979_EPUB-52', 'text/part0225.html#x9781440631979_EPUB-53', 'text/part0226.html#x9781440631979_EPUB-54', 'text/part0227.html#x9781440631979_EPUB-55', 'text/part0228.html#x9781440631979_EPUB-56', 'text/part0229.html#x9781440631979_EPUB-57', 'text/part0230.html#x9781440631979_EPUB-58', 'text/part0232.html#6T82G0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0233.html#x9781440619649_EPUB-2', 'text/part0234.html#x9781440619649_EPUB-3', 'text/part0235.html#703K60-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0236.html#x9781440619649_EPUB-4', 'text/part0237.html#x9781440619649_EPUB-5', 'text/part0238.html#x9781440619649_EPUB-6', 'text/part0239.html#x9781440619649_EPUB-7', 'text/part0240.html#x9781440619649_EPUB-8', 'text/part0241.html#x9781440619649_EPUB-9', 'text/part0242.html#x9781440619649_EPUB-10', 'text/part0243.html#x9781440619649_EPUB-11', 'text/part0244.html#x9781440619649_EPUB-12', 'text/part0245.html#x9781440619649_EPUB-13', 'text/part0246.html#x9781440619649_EPUB-14', 'text/part0247.html#x9781440619649_EPUB-15', 'text/part0248.html#x9781440619649_EPUB-16', 'text/part0249.html#x9781440619649_EPUB-17', 'text/part0250.html#x9781440619649_EPUB-18', 'text/part0251.html#x9781440619649_EPUB-19', 'text/part0252.html#x9781440619649_EPUB-20', 'text/part0253.html#x9781440619649_EPUB-21', 'text/part0254.html#x9781440619649_EPUB-22', 'text/part0255.html#x9781440619649_EPUB-23', 'text/part0256.html#x9781440619649_EPUB-24', 'text/part0257.html#x9781440619649_EPUB-25', 'text/part0258.html#x9781440619649_EPUB-26', 'text/part0259.html#x9781440619649_EPUB-27', 'text/part0260.html#x9781440619649_EPUB-28', 'text/part0261.html#x9781440619649_EPUB-29', 'text/part0262.html#x9781440619649_EPUB-30', 'text/part0263.html#x9781440619649_EPUB-31', 'text/part0264.html#x9781440619649_EPUB-32', 'text/part0265.html#x9781440619649_EPUB-33', 'text/part0266.html#x9781440619649_EPUB-34', 'text/part0267.html#x9781440619649_EPUB-35', 'text/part0268.html#x9781440619649_EPUB-36', 'text/part0269.html#x9781440619649_EPUB-37', 'text/part0270.html#x9781440619649_EPUB-38', 'text/part0271.html#x9781440619649_EPUB-39', 'text/part0272.html#x9781440619649_EPUB-40', 'text/part0273.html#x9781440619649_EPUB-41', 'text/part0274.html#x9781440619649_EPUB-42', 'text/part0275.html#x9781440619649_EPUB-43', 'text/part0276.html#x9781440619649_EPUB-44', 'text/part0277.html#x9781440619649_EPUB-45', 'text/part0278.html#x9781440619649_EPUB-46', 'text/part0279.html#x9781440619649_EPUB-47', 'text/part0280.html#x9781440619649_EPUB-48', 'text/part0281.html#x9781440619649_EPUB-49', 'text/part0282.html#x9781440619649_EPUB-50', 'text/part0283.html#x9781440619649_EPUB-51', 'text/part0284.html#8EQVO0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0285.html#x9781440619236_EPUB-1', 'text/part0286.html#x9781440619236_EPUB-2', 'text/part0287.html#8HMHE0-9d088d4ffd7e4135ab987c63f18099d5', 'text/part0288.html#x9781440619236_EPUB-3', 'text/part0289.html#x9781440619236_EPUB-4', 'text/part0290.html#x9781440619236_EPUB-5', 'text/part0291.html#x9781440619236_EPUB-6', 'text/part0292.html#x9781440619236_EPUB-7', 'text/part0293.html#x9781440619236_EPUB-8', 'text/part0294.html#x9781440619236_EPUB-9', 'text/part0295.html#x9781440619236_EPUB-10', 'text/part0296.html#x9781440619236_EPUB-11', 'text/part0297.html#x9781440619236_EPUB-12', 'text/part0298.html#x9781440619236_EPUB-13', 'text/part0299.html#x9781440619236_EPUB-14', 'text/part0300.html#x9781440619236_EPUB-15', 'text/part0301.html#x9781440619236_EPUB-16', 'text/part0302.html#x9781440619236_EPUB-17', 'text/part0303.html#x9781440619236_EPUB-18', 'text/part0304.html#x9781440619236_EPUB-19', 'text/part0305.html#x9781440619236_EPUB-20', 'text/part0306.html#x9781440619236_EPUB-21', 'text/part0307.html#x9781440619236_EPUB-22', 'text/part0308.html#x9781440619236_EPUB-23', 'text/part0309.html#x9781440619236_EPUB-24', 'text/part0310.html#x9781440619236_EPUB-25', 'text/part0311.html#x9781440619236_EPUB-26', 'text/part0312.html#x9781440619236_EPUB-27', 'text/part0313.html#x9781440619236_EPUB-28', 'text/part0314.html#x9781440619236_EPUB-29', 'text/part0315.html#x9781440619236_EPUB-30', 'text/part0316.html#x9781440619236_EPUB-31', 'text/part0317.html#x9781440619236_EPUB-32', 'text/part0318.html#x9781440619236_EPUB-33', 'text/part0319.html#x9781440619236_EPUB-34', 'text/part0320.html#x9781440619236_EPUB-35', 'text/part0321.html#x9781440619236_EPUB-36', 'text/part0322.html#x9781440619236_EPUB-37', 'text/part0323.html#x9781440619236_EPUB-38', 'text/part0324.html#x9781440619236_EPUB-39', 'text/part0325.html#x9781440619236_EPUB-40', 'text/part0326.html#x9781440619236_EPUB-41', 'text/part0327.html#x9781440619236_EPUB-42', 'text/part0328.html#x9781440619236_EPUB-43', 'text/part0329.html#x9781440619236_EPUB-44', 'text/part0330.html#x9781440619236_EPUB-45', 'text/part0331.html#x9781440619236_EPUB-46', 'text/part0332.html#x9781440619236_EPUB-47', 'text/part0333.html#x9781440619236_EPUB-48', 'text/part0334.html#x9781440619236_EPUB-49', 'text/part0335.html#x9781440619236_EPUB-50', 'text/part0336.html#x9781440619236_EPUB-51', 'text/part0337.html#x9781440619236_EPUB-52', 'text/part0338.html#A2AU40-9d088d4ffd7e4135ab987c63f18099d5', 'kindle:embed:0001?mime=image/jpg', 'part0000.html#0-9d088d4ffd7e4135ab987c63f18099d5', 'part0004.html#3Q280-9d088d4ffd7e4135ab987c63f18099d5', 'part0069.html#21PMQ0-9d088d4ffd7e4135ab987c63f18099d5', 'part0101.html#30A8Q0-9d088d4ffd7e4135ab987c63f18099d5', 'part0172.html#5410O0-9d088d4ffd7e4135ab987c63f18099d5', 'part0232.html#6T82G0-9d088d4ffd7e4135ab987c63f18099d5', 'part0284.html#8EQVO0-9d088d4ffd7e4135ab987c63f18099d5', 'http://penguinrandomhouse.com', 'part0009.html#8IL20-9d088d4ffd7e4135ab987c63f18099d5', 'part0010.html#9H5K0-9d088d4ffd7e4135ab987c63f18099d5', 'part0011.html#AFM60-9d088d4ffd7e4135ab987c63f18099d5', 'part0012.html#BE6O0-9d088d4ffd7e4135ab987c63f18099d5', 'part0013.html#CCNA0-9d088d4ffd7e4135ab987c63f18099d5', 'part0014.html#DB7S0-9d088d4ffd7e4135ab987c63f18099d5', 'part0015.html#E9OE0-9d088d4ffd7e4135ab987c63f18099d5', 'part0016.html#F8900-9d088d4ffd7e4135ab987c63f18099d5', 'part0017.html#G6PI0-9d088d4ffd7e4135ab987c63f18099d5', 'part0018.html#H5A40-9d088d4ffd7e4135ab987c63f18099d5', 'part0019.html#I3QM0-9d088d4ffd7e4135ab987c63f18099d5', 'part0020.html#J2B80-9d088d4ffd7e4135ab987c63f18099d5', 'part0021.html#K0RQ0-9d088d4ffd7e4135ab987c63f18099d5', 'part0022.html#KVCC0-9d088d4ffd7e4135ab987c63f18099d5', 'part0023.html#LTSU0-9d088d4ffd7e4135ab987c63f18099d5', 'part0024.html#MSDG0-9d088d4ffd7e4135ab987c63f18099d5', 'part0025.html#NQU20-9d088d4ffd7e4135ab987c63f18099d5', 'part0026.html#OPEK0-9d088d4ffd7e4135ab987c63f18099d5', 'part0027.html#PNV60-9d088d4ffd7e4135ab987c63f18099d5', 'part0028.html#QMFO0-9d088d4ffd7e4135ab987c63f18099d5', 'part0029.html#RL0A0-9d088d4ffd7e4135ab987c63f18099d5', 'part0030.html#SJGS0-9d088d4ffd7e4135ab987c63f18099d5', 'part0031.html#TI1E0-9d088d4ffd7e4135ab987c63f18099d5', 'part0032.html#UGI00-9d088d4ffd7e4135ab987c63f18099d5', 'part0033.html#VF2I0-9d088d4ffd7e4135ab987c63f18099d5', 'part0034.html#10DJ40-9d088d4ffd7e4135ab987c63f18099d5', 'part0035.html#11C3M0-9d088d4ffd7e4135ab987c63f18099d5', 'part0036.html#12AK80-9d088d4ffd7e4135ab987c63f18099d5', 'part0037.html#1394Q0-9d088d4ffd7e4135ab987c63f18099d5', 'part0038.html#147LC0-9d088d4ffd7e4135ab987c63f18099d5', 'part0039.html#1565U0-9d088d4ffd7e4135ab987c63f18099d5', 'part0040.html#164MG0-9d088d4ffd7e4135ab987c63f18099d5', 'part0041.html#173720-9d088d4ffd7e4135ab987c63f18099d5', 'part0042.html#181NK0-9d088d4ffd7e4135ab987c63f18099d5', 'part0043.html#190860-9d088d4ffd7e4135ab987c63f18099d5', 'part0044.html#19UOO0-9d088d4ffd7e4135ab987c63f18099d5', 'part0045.html#1AT9A0-9d088d4ffd7e4135ab987c63f18099d5', 'part0046.html#1BRPS0-9d088d4ffd7e4135ab987c63f18099d5', 'part0047.html#1CQAE0-9d088d4ffd7e4135ab987c63f18099d5', 'part0048.html#1DOR00-9d088d4ffd7e4135ab987c63f18099d5', 'part0049.html#1ENBI0-9d088d4ffd7e4135ab987c63f18099d5', 'part0050.html#1FLS40-9d088d4ffd7e4135ab987c63f18099d5', 'part0051.html#1GKCM0-9d088d4ffd7e4135ab987c63f18099d5', 'part0052.html#1HIT80-9d088d4ffd7e4135ab987c63f18099d5', 'part0053.html#1IHDQ0-9d088d4ffd7e4135ab987c63f18099d5', 'part0054.html#1JFUC0-9d088d4ffd7e4135ab987c63f18099d5', 'part0055.html#1KEEU0-9d088d4ffd7e4135ab987c63f18099d5', 'part0056.html#1LCVG0-9d088d4ffd7e4135ab987c63f18099d5', 'part0057.html#1MBG20-9d088d4ffd7e4135ab987c63f18099d5', 'part0058.html#1NA0K0-9d088d4ffd7e4135ab987c63f18099d5', 'part0059.html#1O8H60-9d088d4ffd7e4135ab987c63f18099d5', 'part0061.html#1Q5IA0-9d088d4ffd7e4135ab987c63f18099d5', 'part0062.html#1R42S0-9d088d4ffd7e4135ab987c63f18099d5', 'part0063.html#1S2JE0-9d088d4ffd7e4135ab987c63f18099d5', 'part0064.html#1T1400-9d088d4ffd7e4135ab987c63f18099d5', 'part0065.html#1TVKI0-9d088d4ffd7e4135ab987c63f18099d5', 'part0066.html#1UU540-9d088d4ffd7e4135ab987c63f18099d5', 'part0067.html#1VSLM0-9d088d4ffd7e4135ab987c63f18099d5', 'part0068.html#20R680-9d088d4ffd7e4135ab987c63f18099d5', None, None, 'http://penguinrandomhouse.com', 'part0070.html#x9781101157879_EPUB-4', 'part0071.html#x9781101157879_EPUB-2', 'part0073.html#x9781101157879_EPUB-3', 'part0074.html#x9781101157879_EPUB-5', 'part0075.html#x9781101157879_EPUB-6', 'part0076.html#x9781101157879_EPUB-7', 'part0077.html#x9781101157879_EPUB-8', 'part0078.html#x9781101157879_EPUB-9', 'part0079.html#x9781101157879_EPUB-10', 'part0080.html#x9781101157879_EPUB-11', 'part0081.html#x9781101157879_EPUB-12', 'part0082.html#x9781101157879_EPUB-13', 'part0083.html#x9781101157879_EPUB-14', 'part0084.html#x9781101157879_EPUB-15', 'part0085.html#x9781101157879_EPUB-16', 'part0086.html#x9781101157879_EPUB-17', 'part0087.html#x9781101157879_EPUB-18', 'part0088.html#x9781101157879_EPUB-19', 'part0089.html#x9781101157879_EPUB-20', 'part0090.html#x9781101157879_EPUB-21', 'part0091.html#x9781101157879_EPUB-22', 'part0092.html#x9781101157879_EPUB-23', 'part0093.html#x9781101157879_EPUB-24', 'part0094.html#x9781101157879_EPUB-25', 'part0095.html#x9781101157879_EPUB-26', 'part0096.html#x9781101157879_EPUB-27', 'part0097.html#x9781101157879_EPUB-28', 'part0098.html#x9781101157879_EPUB-29', 'part0099.html#x9781101157879_EPUB-30', 'part0100.html#footnote_1', None, None, None, None, 'part0073.html#footnote-000-backlink', None, None, 'http://penguinrandomhouse.com', None, 'part0102.html#x9781440630514_EPUB-2', 'part0103.html#x9781440630514_EPUB-3', 'part0104.html#x9781440630514_EPUB-4', 'part0106.html#x9781440630514_EPUB-5', 'part0107.html#x9781440630514_EPUB-6', 'part0108.html#x9781440630514_EPUB-7', 'part0109.html#x9781440630514_EPUB-8', 'part0110.html#x9781440630514_EPUB-9', 'part0111.html#x9781440630514_EPUB-10', 'part0112.html#x9781440630514_EPUB-11', 'part0113.html#x9781440630514_EPUB-12', 'part0114.html#x9781440630514_EPUB-13', 'part0115.html#x9781440630514_EPUB-14', 'part0116.html#x9781440630514_EPUB-15', 'part0117.html#x9781440630514_EPUB-16', 'part0118.html#x9781440630514_EPUB-17', 'part0119.html#x9781440630514_EPUB-18', 'part0120.html#x9781440630514_EPUB-19', 'part0121.html#x9781440630514_EPUB-20', 'part0122.html#x9781440630514_EPUB-21', 'part0123.html#x9781440630514_EPUB-22', 'part0124.html#x9781440630514_EPUB-23', 'part0125.html#x9781440630514_EPUB-24', 'part0126.html#x9781440630514_EPUB-25', 'part0127.html#x9781440630514_EPUB-26', 'part0128.html#x9781440630514_EPUB-27', 'part0129.html#x9781440630514_EPUB-28', 'part0130.html#x9781440630514_EPUB-29', 'part0131.html#x9781440630514_EPUB-30', 'part0132.html#x9781440630514_EPUB-31', 'part0133.html#x9781440630514_EPUB-32', 'part0134.html#x9781440630514_EPUB-33', 'part0135.html#x9781440630514_EPUB-34', 'part0136.html#x9781440630514_EPUB-35', 'part0137.html#x9781440630514_EPUB-36', 'part0138.html#x9781440630514_EPUB-37', 'part0139.html#x9781440630514_EPUB-38', 'part0140.html#x9781440630514_EPUB-39', 'part0141.html#x9781440630514_EPUB-40', 'part0142.html#x9781440630514_EPUB-41', 'part0143.html#x9781440630514_EPUB-42', 'part0144.html#x9781440630514_EPUB-43', 'part0145.html#x9781440630514_EPUB-44', 'part0146.html#x9781440630514_EPUB-45', 'part0147.html#x9781440630514_EPUB-46', 'part0148.html#x9781440630514_EPUB-47', 'part0149.html#x9781440630514_EPUB-48', 'part0150.html#x9781440630514_EPUB-49', 'part0151.html#x9781440630514_EPUB-50', 'part0152.html#x9781440630514_EPUB-51', 'part0153.html#x9781440630514_EPUB-52', 'part0154.html#x9781440630514_EPUB-53', 'part0155.html#x9781440630514_EPUB-54', 'part0156.html#x9781440630514_EPUB-55', 'part0157.html#x9781440630514_EPUB-56', 'part0158.html#x9781440630514_EPUB-57', 'part0159.html#x9781440630514_EPUB-58', 'part0160.html#x9781440630514_EPUB-59', 'part0161.html#x9781440630514_EPUB-60', 'part0162.html#x9781440630514_EPUB-61', 'part0163.html#x9781440630514_EPUB-62', 'part0164.html#x9781440630514_EPUB-63', 'part0165.html#x9781440630514_EPUB-64', 'part0166.html#x9781440630514_EPUB-65', 'part0167.html#x9781440630514_EPUB-66', 'part0168.html#x9781440630514_EPUB-67', 'part0169.html#x9781440630514_EPUB-68', 'part0170.html#x9781440630514_EPUB-69', 'part0171.html#x9781440630514_EPUB-70', None, None, 'part0173.html#x9781440631979_EPUB-2', 'part0174.html#x9781440631979_EPUB-3', 'part0175.html#x9781440631979_EPUB-4', 'part0177.html#x9781440631979_EPUB-5', 'part0179.html#x9781440631979_EPUB-7', 'part0182.html#x9781440631979_EPUB-10', 'part0183.html#x9781440631979_EPUB-11', 'part0184.html#x9781440631979_EPUB-12', 'part0185.html#x9781440631979_EPUB-13', 'part0186.html#x9781440631979_EPUB-14', 'part0187_split_000.html#x9781440631979_EPUB-15', 'part0188.html#x9781440631979_EPUB-16', 'part0189_split_000.html#x9781440631979_EPUB-17', 'part0190.html#x9781440631979_EPUB-18', 'part0191.html#x9781440631979_EPUB-19', 'part0192.html#x9781440631979_EPUB-20', 'part0193.html#x9781440631979_EPUB-21', 'part0194.html#x9781440631979_EPUB-22', 'part0195.html#x9781440631979_EPUB-23', 'part0196_split_000.html#x9781440631979_EPUB-24', 'part0197.html#x9781440631979_EPUB-25', 'part0198.html#x9781440631979_EPUB-26', 'part0199.html#x9781440631979_EPUB-27', 'part0200.html#x9781440631979_EPUB-28', 'part0201.html#x9781440631979_EPUB-29', 'part0202.html#x9781440631979_EPUB-30', 'part0203.html#x9781440631979_EPUB-31', 'part0204.html#x9781440631979_EPUB-32', 'part0205.html#x9781440631979_EPUB-33', 'part0206.html#x9781440631979_EPUB-34', 'part0207.html#x9781440631979_EPUB-35', 'part0208.html#x9781440631979_EPUB-36', 'part0209.html#x9781440631979_EPUB-37', 'part0210.html#x9781440631979_EPUB-38', 'part0211.html#x9781440631979_EPUB-39', 'part0212.html#x9781440631979_EPUB-40', 'part0213.html#x9781440631979_EPUB-41', 'part0214.html#x9781440631979_EPUB-42', 'part0215.html#x9781440631979_EPUB-43', 'part0216.html#x9781440631979_EPUB-44', 'part0217.html#x9781440631979_EPUB-45', 'part0218.html#x9781440631979_EPUB-46', 'part0219.html#x9781440631979_EPUB-47', 'part0220.html#x9781440631979_EPUB-48', 'part0221.html#x9781440631979_EPUB-49', 'part0222.html#x9781440631979_EPUB-50', 'part0223.html#x9781440631979_EPUB-51', 'part0224.html#x9781440631979_EPUB-52', 'part0225.html#x9781440631979_EPUB-53', 'part0226.html#x9781440631979_EPUB-54', 'part0227.html#x9781440631979_EPUB-55', 'part0228.html#x9781440631979_EPUB-56', 'part0229.html#x9781440631979_EPUB-57', 'part0230.html#x9781440631979_EPUB-58', None, None, 'part0233.html#x9781440619649_EPUB-2', 'part0234.html#x9781440619649_EPUB-3', 'part0236.html#x9781440619649_EPUB-4', 'part0237.html#x9781440619649_EPUB-5', 'part0238.html#x9781440619649_EPUB-6', 'part0239.html#x9781440619649_EPUB-7', 'part0240.html#x9781440619649_EPUB-8', 'part0241.html#x9781440619649_EPUB-9', 'part0242.html#x9781440619649_EPUB-10', 'part0243.html#x9781440619649_EPUB-11', 'part0244.html#x9781440619649_EPUB-12', 'part0245.html#x9781440619649_EPUB-13', 'part0246.html#x9781440619649_EPUB-14', 'part0247.html#x9781440619649_EPUB-15', 'part0248.html#x9781440619649_EPUB-16', 'part0249.html#x9781440619649_EPUB-17', 'part0250.html#x9781440619649_EPUB-18', 'part0251.html#x9781440619649_EPUB-19', 'part0252.html#x9781440619649_EPUB-20', 'part0253.html#x9781440619649_EPUB-21', 'part0254.html#x9781440619649_EPUB-22', 'part0255.html#x9781440619649_EPUB-23', 'part0256.html#x9781440619649_EPUB-24', 'part0257.html#x9781440619649_EPUB-25', 'part0258.html#x9781440619649_EPUB-26', 'part0259.html#x9781440619649_EPUB-27', 'part0260.html#x9781440619649_EPUB-28', 'part0261.html#x9781440619649_EPUB-29', 'part0262.html#x9781440619649_EPUB-30', 'part0263.html#x9781440619649_EPUB-31', 'part0264.html#x9781440619649_EPUB-32', 'part0265.html#x9781440619649_EPUB-33', 'part0266.html#x9781440619649_EPUB-34', 'part0267.html#x9781440619649_EPUB-35', 'part0268.html#x9781440619649_EPUB-36', 'part0269.html#x9781440619649_EPUB-37', 'part0270.html#x9781440619649_EPUB-38', 'part0271.html#x9781440619649_EPUB-39', 'part0272.html#x9781440619649_EPUB-40', 'part0273.html#x9781440619649_EPUB-41', 'part0274.html#x9781440619649_EPUB-42', 'part0275.html#x9781440619649_EPUB-43', 'part0276.html#x9781440619649_EPUB-44', 'part0277.html#x9781440619649_EPUB-45', 'part0278.html#x9781440619649_EPUB-46', 'part0279.html#x9781440619649_EPUB-47', 'part0280.html#x9781440619649_EPUB-48', 'part0281.html#x9781440619649_EPUB-49', 'part0282.html#x9781440619649_EPUB-50', 'part0283.html#x9781440619649_EPUB-51', None, None, 'part0285.html#x9781440619236_EPUB-1', 'part0286.html#x9781440619236_EPUB-2', 'part0288.html#x9781440619236_EPUB-3', 'part0289.html#x9781440619236_EPUB-4', 'part0290.html#x9781440619236_EPUB-5', 'part0291.html#x9781440619236_EPUB-6', 'part0292.html#x9781440619236_EPUB-7', 'part0293.html#x9781440619236_EPUB-8', 'part0294.html#x9781440619236_EPUB-9', 'part0295.html#x9781440619236_EPUB-10', 'part0296.html#x9781440619236_EPUB-11', 'part0297.html#x9781440619236_EPUB-12', 'part0298.html#x9781440619236_EPUB-13', 'part0299.html#x9781440619236_EPUB-14', 'part0300.html#x9781440619236_EPUB-15', 'part0301.html#x9781440619236_EPUB-16', 'part0302.html#x9781440619236_EPUB-17', 'part0303.html#x9781440619236_EPUB-18', 'part0304.html#x9781440619236_EPUB-19', 'part0305.html#x9781440619236_EPUB-20', 'part0306.html#x9781440619236_EPUB-21', 'part0307.html#x9781440619236_EPUB-22', 'part0308.html#x9781440619236_EPUB-23', 'part0309.html#x9781440619236_EPUB-24', 'part0310.html#x9781440619236_EPUB-25', 'part0311.html#x9781440619236_EPUB-26', 'part0312.html#x9781440619236_EPUB-27', 'part0313.html#x9781440619236_EPUB-28', 'part0314.html#x9781440619236_EPUB-29', 'part0315.html#x9781440619236_EPUB-30', 'part0316.html#x9781440619236_EPUB-31', 'part0317.html#x9781440619236_EPUB-32', 'part0318.html#x9781440619236_EPUB-33', 'part0319.html#x9781440619236_EPUB-34', 'part0320.html#x9781440619236_EPUB-35', 'part0321.html#x9781440619236_EPUB-36', 'part0322.html#x9781440619236_EPUB-37', 'part0323.html#x9781440619236_EPUB-38', 'part0324.html#x9781440619236_EPUB-39', 'part0325.html#x9781440619236_EPUB-40', 'part0326.html#x9781440619236_EPUB-41', 'part0327.html#x9781440619236_EPUB-42', 'part0328.html#x9781440619236_EPUB-43', 'part0329.html#x9781440619236_EPUB-44', 'part0330.html#x9781440619236_EPUB-45', 'part0331.html#x9781440619236_EPUB-46', 'part0332.html#x9781440619236_EPUB-47', 'part0333.html#x9781440619236_EPUB-48', 'part0334.html#x9781440619236_EPUB-49', 'part0335.html#x9781440619236_EPUB-50', 'part0336.html#x9781440619236_EPUB-51', 'part0337.html#x9781440619236_EPUB-52', 'part0338.html#A2AU40-9d088d4ffd7e4135ab987c63f18099d5', 'http://links.penguinrandomhouse.com/type/prhebooklanding/isbn/9780593333020/display/1', 'http://links.penguinrandomhouse.com/type/prhebooklanding/isbn/9780593333020/display/2']
we see that valid hrefs begin with either 'text' or 'part'
output_doc = BeautifulSoup()
output_doc.append(output_doc.new_tag("html"))
output_doc.html.append(output_doc.new_tag("body"))
# Create a new head tag
head_tag = output_doc.new_tag('head')
# Create a link tag for the stylesheet
link_tag = output_doc.new_tag('link', rel='stylesheet', type='text/css', href='style.css')
# Append the link tag to the head tag
head_tag.append(link_tag)
# Insert the head tag into the HTML document
if output_doc.head:
output_doc.head.insert_before(head_tag)
else:
output_doc.insert(0, head_tag)
for file in html_files:
with open(file, 'r') as html_file:
soup = BeautifulSoup(html_file, "html.parser")
body_content = soup.find('body')
# the trick to preserve the id is to hide the body in a div with the same id
div = output_doc.new_tag('div', id=body_content.get('id'))
div.append(body_content.extract())
output_doc.append(div)
# strip the .html file name and preserve the id string, prepend with # to tell it is a href
for link in output_doc.find_all('a'):
href = link.get('href')
if href and href.startswith('text'):
# Update the link to point to the correct section within the merged document
index = href.find('#')
link['href'] = f'{href[index:]}'
if href and href.startswith('part'):
# Update the link to point to the correct section within the merged document
index = href.find('#')
link['href'] = f'{href[index:]}'
with open("output.html", "w", encoding='utf-8') as file:
file.write(str(output_doc.prettify()))