Python BeautifulSoup - Скребание Div Spans и p-тегов - также как получить точное совпадение по имени div - PullRequest
0 голосов
/ 31 октября 2018

У меня есть два элемента div, которые я пытаюсь очистить, с тем же именем (но на странице есть и другие элементы div с частичным совпадением имен, которые мне не нужны). Сначала мне просто нужен текст внутри каждого элемента span. Во втором мне нужен текст внутри элемента span, для первого тогда мне нужен текст внутри тегов

для строк 2 и 3.

Я даже не очень уверен, почему мне нужно нарезать в конце div'ов (я думаю, потому что div-класс col возвращает больше, чем 2 релевантных div-ов, но добавление: 1 в конце div-ов, кажется, помогает)

Мои вопросы - как получить точное совпадение по имени div Как скрести внутри р-теги Как объединить результаты из вышеперечисленного. Я могу получить текст внутри тегов span, как показано ниже, но, как я уже сказал выше, мне также нужен текст внутри тегов p и объединить результаты.

Данные поступают из раздела сведений об игроке в этом URL - https://www.skysports.com/football/player/141016/alisson-ramses-becker

HTML выглядит так

    <div class="row-table details -bp30">
        <div class="col">
            <p>Name: <strong><span itemprop="name">Alisson Ramses Becker</span></strong></p>                <p>Date of birth:<span itemprop="birthDate">02/10/1992</span></p>                <p>Place of birth:<span itemprop="nationality"> Brazil</span></p>               
                        </div>
        <div class="col">
            <p>Club: <span itemprop="affiliation">Liverpool</span></p><p>Squad: 13</p>                <p>Position: Goal Keeper</p>
        </div>
    </div>

Соответствующий фрагмент моей программы

        premier_soup1 = player_soup.find('div', {'class': 'row-table details -bp30'})
        premier_soup_tr = premier_soup1.find_all('div', {'class': 'col'})

        divs = player_soup.find_all( 'div', {'class': 'col'})
        for div in divs[:1]:
            para = div.find_all('p')
            print(para)

Вывод -

    [<p class="text-h4 title">Player Details</p>, <p>Name: <strong><span itemprop="name">Alisson Ramses Becker</span></strong></p>, <p>Date of birth:<span itemprop="birthDate">02/10/1992</span></p>, <p>Place of birth:<span itemprop="nationality"> Brazil</span></p>, <p>Club: <span itemprop="affiliation">Liverpool</span></p>, <p>Squad: 13</p>, <p>Position: Goal Keeper</p>]                               

Также - я знаю, что могу получить текст span с помощью этого

divs = player_soup.find_all( 'div', {'class': 'col'})
for div in divs[:1]:
    spans = div.find_all('span')
    for span in spans:       
        print(span.text, ",", end=' ')

Вывод -

Alisson Ramses Becker , 02/10/1992 ,  Brazil , Liverpool ,              

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

При условии, что у вас есть права на удаление этого сайта, и нет никаких API или возвратов json, один из медленных способов сделать это:

from bs4 import BeautifulSoup as bs

html = '''
 <div class="row-table details -bp30">
        <div class="col">
            <p>Name: <strong><span itemprop="name">Alisson Ramses Becker</span></strong></p>                <p>Date of birth:<span itemprop="birthDate">02/10/1992</span></p>                <p>Place of birth:<span itemprop="nationality"> Brazil</span></p>               
                        </div>
        <div class="col">
            <p>Club: <span itemprop="affiliation">Liverpool</span></p><p>Squad: 13</p>                <p>Position: Goal Keeper</p>
        </div>
    </div>
'''

soup = bs(html,'html5lib')

data = [d.find_all('p') for d in soup.find_all('div',{'class':'col'})]

value = []
for i in data:
    for j in i:
        value.append(j.text)

print(value)
0 голосов
/ 01 ноября 2018

Ваш главный вопрос - как извлечь текст из <p>, который не содержит <span>.

NavigableString Строка соответствует фрагменту текста в теге . Таким образом, вы можете извлечь текст, если они являются экземплярами NavigableString

from bs4 import BeautifulSoup,NavigableString
html = "your example"

soup = BeautifulSoup(html,"lxml")
for e in soup.find("p"):
    print(e,type(e))
#Name:  <class 'bs4.element.NavigableString'>
#<strong><span itemprop="name">Alisson Ramses Becker</span></strong> <class 'bs4.element.Tag'>

Реальный код:

resultset = soup.find_all("p")
maintext = []
for result in resultset:
    for element in result:
        if isinstance(element, NavigableString):
            maintext.append(element)

print(maintext)
# ['Name: ', 'Date of birth:', 'Place of birth:', 'Club: ', 'Squad: 13', 'Position: Goal Keeper']

равно

[element for result in resultset for element in result if isinstance(element, NavigableString)]

Мой полный тестовый код

from bs4 import BeautifulSoup,NavigableString
html = """

    <div class="row-table details -bp30">
        <div class="col">
            <p>Name: <strong><span itemprop="name">Alisson Ramses Becker</span></strong></p>                <p>Date of birth:<span itemprop="birthDate">02/10/1992</span></p>                <p>Place of birth:<span itemprop="nationality"> Brazil</span></p>               
                        </div>
        <div class="col">
            <p>Club: <span itemprop="affiliation">Liverpool</span></p><p>Squad: 13</p>                <p>Position: Goal Keeper</p>
        </div>
    </div>
"""
soup = BeautifulSoup(html,"lxml")
resultset = soup.find_all("p")
fr = [element for result in resultset for element in result if isinstance(element, NavigableString)]
spanset = [e.text for e in soup.find_all("span",{"itemprop":True})]
setA = ["".join(z) for z in zip(fr,spanset)]
final = setA + fr[len(spanset):]
print(final)

выход

['Name: Alisson Ramses Becker', 'Date of birth:02/10/1992', 'Place of birth: Brazil', 'Club: Liverpool', 'Squad: 13', 'Position: Goal Keeper']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...