Я хочу очистить часть «диалога о нуждах» из вики 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)
Я попытался очистить часть вики, но он взял не тот раздел. ⇐ Python
Программы на Python
-
Anonymous
1774679043
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)
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия