найти класс div по тексту элемента внутри него - PullRequest
1 голос
/ 21 мая 2019

Я сканирую игровой сайт и хочу получить объект div, содержащий определенный текст.В этом случае я хочу получить класс div "GameItemWrap", который содержит ссылку с текстом "SANDBOX Ghost".Есть много классов GameItemWrap во всем коде, и я не хочу получать div класса "SummonerName", потому что внутри "GameItemWrap" есть некоторые другие классы, которые мне нужны.

Это то, что я пробовал:

duo_name='SANDBOX Ghost'    
gamelist=soup.find('div',"GameItemList")# "GameItemList" is a div that contains "GameItemWrap"
games=gamelist.find_all('GameItemWrap',{('a'):duo_name })

Вот как выглядит сканируемый javascript:

<div class="GameItemWrap>
    #some other div classes that i will need in the future 
    <div class="SummonerName">                                                       
        <a href="//www.op.gg/summoner/userName=SANDBOX+Ghost" class="Link" target="_blank">SANDBOX Ghost</a>                                                 
    </div>
</div>

Я ожидаю 4 GameItemWraps, которые содержат текст "SANDBOX Ghost", но когда я печатаю

print(len(games)) 

на выходе 0. Это не работает.Также я не хочу проверять каждый класс GameItemWraps, чтобы проверить, содержат ли они "SANDBOX Ghost" или нет. Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

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

duo_name='SANDBOX Ghost'
games = soup.find_all('a',string=duo_name)

полный код выглядит как

from bs4 import BeautifulSoup
import re
chunk = '''<div class="GameItemWrap">
    #some other div classes that i will need in the future
    <div class="SummonerName">
        <a href="//www.op.gg/summoner/userName=SANDBOX+Ghost" class="Link" target="_blank">SANDBOX Ghost</a>
    </div>
</div>'''
soup = BeautifulSoup(chunk,'html5lib')
game_data = {}
duo_name='SANDBOX Ghost'
for chunks in soup.find_all('div',{'class':'GameItemWrap'}):
    if chunks.find('a',string=duo_name):
        chunk_for_future = chunks
        a_tag = chunks.find('a',string=duo_name)
        game_data[a_tag.text] = a_tag['href']
print(game_data)

и ваши результаты будут (проиллюстрированы в dict),

{'SANDBOX Ghost': '//www.op.gg/summoner/userName=SANDBOX+Ghost'}
0 голосов
/ 21 мая 2019

После исправления показанного html с bs4 4.7.1 я ожидаю, что вы сможете использовать :contains псевдокласс

from bs4 import BeautifulSoup as bs

html ='''
<div class="GameItemWrap">
    #some other div classes that i will need in the future 
    <div class="SummonerName">                                                       
        <a href="//www.op.gg/summoner/userName=SANDBOX+Ghost" class="Link" target="_blank">SANDBOX Ghost</a>                                                 
    </div>
</div>
'''
duo_name = 'SANDBOX Ghost'
soup = bs(html, 'lxml') #'html.parser' if lxml not installed
items = soup.select('.GameItemWrap:contains("' + duo_name + '")')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...