BeautifulSoup — извлечение блоков контента после определенных подзаголовков в более крупном разделе, игнорируя введение Python

Программы на Python
Ответить
Anonymous
 BeautifulSoup — извлечение блоков контента после определенных подзаголовков в более крупном разделе, игнорируя введение

Сообщение Anonymous »

Я очищаю вики Fandom Dead by Daylight (в частности, страницы TOME, например, https://deadbydaylight.fandom.com/wiki/ ... _Awakening), чтобы извлечь журналы памяти.
Цель – извлечь Заголовок воспоминания (

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

mw-headline 
) и соответствующий ему Тело памяти (текст, содержащийся в последующих элементах, таких как , и т. д.) как отдельные записи, при этом строго игнорируя основной вводный текст TOME в верхней части страницы.
Проблема
Мой текущий сценарий успешно идентифицирует все заголовки памяти, но функция, предназначенная для извлечения основного содержимого TOME, часто неправильно включает общий TOME. вводный текст (большой обзорный абзац в самом верху статьи) в тело извлеченного первого журнала памяти. Это приводит к дублированию и неправильному основному тексту для многих последующих записей памяти.
Основная проблема заключается в правильном определении области извлечения содержимого: мне нужно убедиться, что при поиске содержимого тела памяти после заголовка памяти он просматривает только элементы до следующего заголовка памяти.
Мой текущий подход (упрощенный)
У меня есть две основные функции:
  • Код: Выделить всё

    crawl_and_extract_tags
    : находит основной раздел «Воспоминания и журналы» и перебирает отдельные заголовки воспоминаний (

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

    mw-headline 
    ).
  • Код: Выделить всё

    extract_content_after_headline
    : принимает тег заголовка памяти и просматривает его следующих одноуровневых элементов, чтобы найти содержимое тела до следующего основного заголовка.
Основная логика Extract_content_after_headline (где, вероятно, кроется проблема):

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

def extract_content_after_headline(headline_tag):
body_content = []

# Finds the immediate parent heading (e.g., ) of the specific memory title ()
parent_heading = headline_tag.find_parent(['h2', 'h3', 'h4'])
if not parent_heading:
return "Parent tag not found", ""

# Start searching from the next sibling of the parent heading
current_element = parent_heading.next_sibling

# Loop until the next major heading (h2, h3, h4) is found
while current_element and current_element.name not in ['h2', 'h3', 'h4']:
if current_element.name in ['td', 'p', 'div', 'blockquote', 'li']:
element_text = current_element.get_text(separator=' ', strip=True)
if element_text:
body_content.append(element_text)

current_element = current_element.next_sibling

return "\n\n".join(body_content), "" # Omitted italics content for brevity
Запрос
  • Как я могу изменить extract_content_after_headline, чтобы надежно захватывать только контент, принадлежащий этому конкретному журналу памяти, без использования общего введения страницы?
  • Есть ли лучший способ структурировать поток извлечения (например, найти границы основных «Воспоминаний и Журналы" более строго), чтобы вводный текст не воспринимался как тело первой памяти?
Есть предложения по использованию селекторов или методов обхода BeautifulSoup (

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

find_next_sibling
и т. д.) более эффективно в этой вики-структуре Фэндома были бы очень признательны.
Полный код:
import os
import requests
from bs4 import BeautifulSoup
import pandas as pd
# pandas가 Excel 파일 읽기/쓰기를 위해 openpyxl을 사용합니다.

# --- 상수 설정 ---
# 파일 확장자를 .xlsx로 변경
DEFAULT_TEXT_FILENAME = "DbD_TOME_Extracted_Data.xlsx"

def extract_content_after_headline(headline_tag):
"""
주어진 mw-headline 태그 뒤에 오는 메모리 본문 (모든 텍스트 요소)과
이탤릭체 내용 ()을 다음 헤드라인이 나타날 때까지 추출합니다.

핵심 개선: 텍스트 노드와 함께
Изображение

Таким образом, основные текстовые предложения не выравниваются должным образом в Excel.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ithin-a-la
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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