Я попытался очистить часть вики, но он взял не тот раздел.Python

Программы на Python
Ответить
Anonymous
 Я попытался очистить часть вики, но он взял не тот раздел.

Сообщение Anonymous »

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

Может ли кто-нибудь помочь с этим? Я потратил на это пару часов и не хочу отказываться от этого проекта (я никогда раньше не занимался программированием).
import requests
from bs4 import BeautifulSoup
import csv
from urllib.parse import urljoin
import time

class SilksongEnemiesScraper:
def __init__(self, base_url, output_file="needolin_dialogue.csv"):
self.base_url = base_url
self.output_file = output_file
self.session = requests.Session()
self.session.headers.update({"User-Agent": "Mozilla/5.0"})

def fetch_page(self, url):
response = self.session.get(url, timeout=10)
response.raise_for_status()
return BeautifulSoup(response.text, "html.parser")

def get_enemy_links(self):
soup = self.fetch_page(self.base_url)
links = []
content_div = soup.select_one("#mw-content-text")
if content_div:
for a in content_div.select("a"):
href = a.get("href")
name = a.get_text(strip=True)
# Only keep links that look like enemy pages
if href and href.startswith("/w/") and name and ":" not in href:
full = urljoin(self.base_url, href)
if full not in links:
links.append((name, full))
return links

def scrape_enemy_dialogue(self, url):
soup = self.fetch_page(url)
dialogue = []

# Look for any header that contains "Needolin Dialogue"
for header in soup.find_all(["h2"]):
if "Dialogue" in header.get_text(strip=True):
# Next sibling has the lines
ul = header.find_next_sibling("ul")
if ul:
dialogue = [li.get_text(strip=True) for li in ul.find_all("li")]
print("collected", dialogue)
break

return dialogue

def scrape_all(self):
enemies = self.get_enemy_links()
results = []
for name, url in enemies:
print(f"Scraping {name}...")
dia = self.scrape_enemy_dialogue(url)
results.append({
"enemy_name": name,
"needolin_dialogue": " | ".join(dia) if dia else ""
})
time.sleep(1)
return results

def save_csv(self, data):
with open(self.output_file, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["enemy_name", "needolin_dialogue"])
writer.writeheader()
writer.writerows(data)
print(f"Saved", len(data), "entries to", self.output_file)

# Start scraping
scraper = SilksongEnemiesScraper("https://hollowknight.wiki/w/Enemies_(Silksong)")
all_data = scraper.scrape_all()
scraper.save_csv(all_data)
Ответить

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

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

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

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

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