как найти каждую ссылку в виде строки на странице html с Beautiful Soup? (функция findAll не подходит для этого сайта) - PullRequest
0 голосов
/ 27 мая 2020

Я хочу добавить имена всех героев Dota2; они отображаются в виде ссылок из https://dota2.gamepedia.com/Abaddon/Counters в список.

вот мой тестовый код:

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq

my_url = 'https://dota2.gamepedia.com/Abaddon/Counters'
print(Child_url+hero_link_list[0])
uClient = uReq(my_url)
page_html = uClient.read()
page_soup = soup(page_html, "html.parser")
containers = page_soup.findAll("div", {"class": "mw-parser-output"})

print(containers)

Но после печати переменной контейнера почти вся информация в этом теге div отсутствует, добавляются только некоторые комментарии. Понятия не имею, почему это происходит. после этого шага у меня есть идея отказаться от ссылок, но сначала мне нужно добавить информацию о дырах в контейнеры.

1 Ответ

1 голос
/ 27 мая 2020

Этот скрипт напечатает здесь все имена:

import requests
from bs4 import BeautifulSoup

url = 'https://dota2.gamepedia.com/Abaddon/Counters'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')

all_heros = [a.text for a in soup.select('b > a')]

#print them:
print(*all_heros, sep='\n')

Печать:

Ancient Apparition
Axe
Brewmaster
Doom
Lina
Lion
Mars
Outworld Devourer
Silencer
Shadow Demon
Death Prophet
Mirana
Bane
Batrider
Beastmaster
Chen
Techies
Bloodseeker
Necrophos
Nyx Assassin
Storm Spirit
Phantom Assassin
Io
Axe
Legion Commander
Centaur Warrunner
Oracle

EDIT (Чтобы очистить категории, вы можете использовать функцию .find_previous()):

import requests
from bs4 import BeautifulSoup

url = 'https://dota2.gamepedia.com/Abaddon/Counters'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')

data = {}
for hero in soup.select('b > a'):
    data.setdefault(hero.find_previous(class_='mw-headline').text, []).append(hero.text)

#print them:
from pprint import pprint
pprint(data)

Печать:

{'Bad against...': ['Ancient Apparition',
                    'Axe',
                    'Brewmaster',
                    'Doom',
                    'Lina',
                    'Lion',
                    'Mars',
                    'Outworld Devourer',
                    'Silencer',
                    'Shadow Demon'],
 'Good against...': ['Death Prophet',
                     'Mirana',
                     'Bane',
                     'Batrider',
                     'Beastmaster',
                     'Chen',
                     'Techies',
                     'Bloodseeker',
                     'Necrophos',
                     'Nyx Assassin'],
 'Works well with...': ['Storm Spirit',
                        'Phantom Assassin',
                        'Io',
                        'Axe',
                        'Legion Commander',
                        'Centaur Warrunner',
                        'Oracle']}
...