На странице код генерируется при помощи JS поэтому для парсинга предлагаю использовать selenium + BS. Если получить контент с помощью selenium то проблема в Вашем коде в том, что weapon_url = weapon_url.find("tbody").find("tr").find("td").find("a").get("href")
вернёт только первую ссылку из массива и она будет ссылаться на изображение, вот пример:href="https://static.wikia.nocookie.net/eldenring/images/2/2e/ER_Icon_weapon_Battle_Axe.png/revision/latest?cb=20220411004827"
. В Вашем случае вы хотите вернуть все ссылки на оружие, поэтому предлагаю такое решение, оно не самое элегантное но рабочее. В конце мы собираем все ссылки включая те, что я упомянул выше, поэтому мы их фильтруем по условию и выводим только ссылки, которые нас интересуют, предварительно передав названия домена для полноты ссылки. А вот собственно и код:
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
url = f'https://eldenring.fandom.com/wiki/Weapons?so=search'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
}
def get_result(url, headers):
chrome_options = Options()
# chrome_options.binary_location = "/opt/google/chrome/google-chrome"
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=chrome_options, executable_path=".../chromedriver_linux64/chromedriver") # the path to your chromedriver
driver.get(url)
time.sleep(10) # You can wait until the page loads, but it's easier to wait 10 seconds, they will be enough with a margin
html = driver.page_source
soup = BeautifulSoup(html, "lxml")
tables = soup.find_all("div", class_="table-wide")
for table in tables:
table = table.find_all("table", class_="sortable wikitable jquery-tablesorter")
for trs in table:
trs = trs.find("tbody").find_all("tr")
for tds in trs:
tds = tds.find_all("td")
for weapon_url in tds:
try:
weapon_url = weapon_url.find("a").get("href")
if weapon_url[0:5]=='https':
pass
else:
print(f'https://eldenring.fandom.com{weapon_url}')
except AttributeError:
pass
def main():
get_result(url=url, headers=headers)
if __name__ == "__main__":
main()
Возвращает:
https://eldenring.fandom.com/wiki/Battle_Axe
https://eldenring.fandom.com/wiki/Celebrant%27s_Cleaver
https://eldenring.fandom.com/wiki/Forked_Hatchet
https://eldenring.fandom.com/wiki/Hand_Axe
https://eldenring.fandom.com/wiki/Highland_Axe
https://eldenring.fandom.com/wiki/Icerind_Hatchet
https://eldenring.fandom.com/wiki/Iron_Cleaver
https://eldenring.fandom.com/wiki/Jawbone_Axe
https://eldenring.fandom.com/wiki/Ripple_Blade
https://eldenring.fandom.com/wiki/Rosus%27_Axe
......