Как сопоставить только первый элемент данного типа в зависимости от их положения в группе братьев и сестер - PullRequest
1 голос
/ 23 апреля 2020

Ниже приведен частичный исходный код ниже:

</td><td class="zentriert"><a href="/statistik/transferrekorde?saison_id=12%2F13&amp;plus=0">12/13</a></td><td class="zentriert">
<img src="https://tmssl.akamaized.net//images/flagge/verysmall/26.png?lm=1520611569" title="Brazil" alt="Brazil" class="flaggenrahmen" /><br />
<img src="https://tmssl.akamaized.net//images/flagge/verysmall/50.png?lm=1520611569" title="France" alt="France" class="flaggenrahmen" />
</td>
<td class="">
<table class="inline-table">
    <tr>

В этом случае я просто хочу получить Бразилию.

Я определил, что всегда есть <br /> перед вторым гражданством, но условие, если nat.previous_sibling! = '<br />' не работает, как предполагалось, оно все еще возвращает Бразилию и Францию.

Мне нужно будет перебрать список для национальностей других игроков, поэтому find () не применима в этом сценарии.

Любая помощь приветствуется.

Код супа Я использовал:

for nationality in pageSoup.find_all('td', attrs={'class': 'zentriert'}):
    nat_des = nationality.descendants
    for nat in nat_des:
        if nat.name == 'img' and nat.get('class', '') == ['flaggenrahmen']:
            if nat.previous_sibling != '<br />':
                print(nat.previous_sibling)

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Не уверен, почему вы перебрали nationality.decendents?

Кроме того, вероятно, будет хорошей идеей найти другой ответ для более чистого способа достижения желаемого результата.

Вот решение с использованием вашей стратегии. Это перебирает nationality и использует find_previous_sibling () . Поскольку для первого изображения нет предыдущего родного брата, нам нужно проверить None

Попробуйте это:

for nationality in soup.find_all('td', attrs={'class': 'zentriert'}):
    for nat in nationality:
        if nat.name == 'img':
            if nat.get('class', '') == ['flaggenrahmen']:
                prev = nat.find_previous_sibling()
                if prev is None or prev.name != 'br':
                    print(f'Image to process is {nat}')

Результат:

Image to process is <img alt="Brazil" class="flaggenrahmen" src="https://tmssl.akamaized.net//images/flagge/verysmall/26.png?lm=1520611569" title="Brazil"/>
0 голосов
/ 23 апреля 2020

Вот более чистый способ сделать это.

Следующий код делает следующие предположения:

  • Необходимые td элементы должны иметь zentriert class
  • Возвращается первый элемент изображения с классом flaggenrahmen
from bs4 import BeautifulSoup

html = """
<td class="zentriert">
    <a href="/statistik/transferrekorde?saison_id=12%2F13&amp;plus=0">12/13</a>
</td>
<td class="zentriert">
    <img src="..." title="Brazil" alt="Brazil" class="flaggenrahmen" /><br />
    <img src="..." title="France" alt="France" class="flaggenrahmen" />
</td>
<td class="nothing">
    <img src="..." title="Japan" alt="Japan" class="flaggenrahmen" /><br />
    <img src="..." title="Mexico" alt="Mexico" class="flaggenrahmen" />
</td>
<td class="zentriert">
    <img src="..." title="India" alt="India" class="flaggenrahmen" /><br />
    <img src="..." title="France" alt="France" class="flaggenrahmen" />
</td>
<td class="zentriert">
    <img src="..." title="Italy" alt="Italy" /><br />
    <img src="..." title="France" alt="France" class="flaggenrahmen" />
    <img src="..." title="Iraq" alt="Iraq" class="flaggenrahmen" />
</td>
"""

soup = BeautifulSoup(html, 'html.parser')
td = soup.select('td.zentriert')

for items in td:
    nationality = items.select('img.flaggenrahmen')
    if nationality:
        print(nationality[0].get('title'))

Результат:

Brazil
India
France
0 голосов
/ 23 апреля 2020

Работа с выбором, чтобы получить первый заголовок

elements = soup.select('td.zentriert img:nth-of-type(1)')

Пример

from bs4 import BeautifulSoup

html = '<td class="zentriert"><a href="/statistik/transferrekorde?saison_id=12%2F13&amp;plus=0">12/13</a></td>' \
       '<td class="zentriert"><img src="https://tmssl.akamaized.net//images/flagge/verysmall/26.png?lm=1520611569" title="Brazil" alt="Brazil" class="flaggenrahmen" /><br />' \
       '<img src="https://tmssl.akamaized.net//images/flagge/verysmall/50.png?lm=1520611569" title="France" alt="France" class="flaggenrahmen" /></td>' \
       '<td class=""><table class="inline-table"><tr>' \


soup = BeautifulSoup(html, features="lxml")
elements = soup.select('td.zentriert img:nth-of-type(1)')


for item in elements:
    b = item.get('title')
    print(b)

Который выдаст только Brazil

...