Вот почему мне нужно написать достаточно «универсальную» и работающую логику в нескольких сценариях. Вот здесь мне нужна поддержка.
Если у нас есть, например:
Код: Выделить всё
Hello
World, how are you doing?
This
is difficult, at
least for me.
World, как дела? в качестве первого элемента, а затем This
сложно,
по крайней мере для меня.
Поэтому текст (и разрывы строк) должен сохраняться при группировке элементов вместе.
Я попробовал несколько подходов, последний:
Код: Выделить всё
def is_visible_text(element):
if isinstance(element, NavigableString):
# Remove non-visible characters using regex
text = re.sub(r'[\u200B-\u200D\uFEFF]', '', element)
return text.strip() != ''
return False
def extract_deepest_text_elements(element):
if isinstance(element, NavigableString) and is_visible_text(element):
return [element]
if element.name in ['br']:
return [element]
# List to hold extracted text and
elements
extracted_elements = []
# Process child elements first
for child in element.contents:
extracted_elements.extend(extract_deepest_text_elements(child))
return extracted_elements
def refine_content(input_file, output_file):
with open(input_file, 'r', encoding='utf-8') as file:
content = file.read()
soup = BeautifulSoup(content, 'html.parser')
new_body_content = soup.new_tag('div')
# Start with the highest-order elements (div, span, p)
elements = soup.find_all(['div', 'span', 'p'])
for elem in elements:
while elem:
deepest_elements = extract_deepest_text_elements(elem)
if deepest_elements:
for element in deepest_elements:
new_body_content.append(element)
new_body_content.append(soup.new_tag('br')) # Ensure BRs after text
# Move up to the parent element
elem = elem.parent if elem.parent and elem.parent.name != 'body' else None
new_soup = BeautifulSoup('', 'html.parser')
new_soup.body.append(new_body_content)
with open(output_file, 'w', encoding='utf-8') as file:
file.write(new_soup.prettify())
Буду очень признателен, если вы решите эту задачу.
Подробнее здесь: https://stackoverflow.com/questions/785 ... ine-breaks