Как извлечь вложенный текст, сохраняя разрывы строк?Python

Программы на Python
Anonymous
Как извлечь вложенный текст, сохраняя разрывы строк?

Сообщение Anonymous »

Я хочу извлечь текст с чрезвычайно вложенного веб-сайта без какого-либо очевидного шаблона или классов, которые я мог бы использовать.
Вот почему мне нужно написать достаточно «универсальную» и работающую логику в нескольких сценариях. Вот здесь мне нужна поддержка.
Если у нас есть, например:

Код: Выделить всё

Hello
World, how are you doing?
This

is difficult, at
least for me.
... Я хотел бы извлечь Hello
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

Вернуться в «Python»