Как получить доступ к данным внутри вложенных тегов span - PullRequest
1 голос
/ 13 июня 2019

Я пытался заменить каждую строку, но не могу заставить ее работать. Я могу получить все данные между <span>...</span>, но не могу, если он закрыт, как я могу это сделать? Я пытался заменить текст впоследствии, но я не могу это сделать. Я новичок в питоне.

Я также пытался использовать for x in soup.find_all('/span', class_ = "textLarge textWhite"), но это ничего не отображает.

Соответствующий html:

<div style="width:100%; display:inline-block; position:relative; text- 
align:center; border-top:thin solid #fff; background-image:linear- 
gradient(#333,#000);">
    <div style="width:100%; max-width:1400px; display:inline-block; 
position:relative; text-align:left; padding:20px 15px 20px 15px;">
        <a href="/manpower-fit-for-military-service.asp" title="Manpower 
Fit for Military Service ranked by country">
            <div class="smGraphContainer"><img class="noBorder" 
src="/imgs/graph.gif" alt="Small graph icon"></div>
        </a>
        <span class="textLarge textWhite"><span 
class="textBold">FIT-FOR-SERVICE:</span> 18,740,382</span>
    </div>
    <div class="blockSheen"></div>
</div>

Соответствующий код Python:

for y in soup.find_all('span', class_ = "textBold"):
    print(y.text) #this gets FIT-FOR-SERVICE:
for x in soup.find_all('span', class_ = "textLarge textWhite"):
    print(x.text) #this gets FIT-FOR-SERVICE: 18,740,382 but i only want the number 

Ожидаемый результат : "18,740,382"

Ответы [ 3 ]

0 голосов
/ 14 июня 2019

Вот как вы могли бы это сделать:

soup.find('span', {'class':'textLarge textWhite'}).find('span').extract()
output = soup.find('span', {'class':'textLarge textWhite'}).text.strip()

вывод:

18,740,382

0 голосов
/ 14 июня 2019

Вместо захвата текста с помощью x.text вы можете использовать x.find_all(text=True, recursive=False), который даст вам весь текст верхнего уровня (в списке строк) для узла, не заходя в дочерние элементы.Вот пример использования ваших данных:

for x in soup.find_all('span', class_ = "textLarge textWhite"):
    res = x.find_all(text=True, recursive=False)
    # join and strip the strings then print
    print(" ".join(map(str.strip, res)))

#outputs: '18,740,382'
0 голосов
/ 14 июня 2019

Я полагаю, у вас есть два варианта:

1 - используйте регулярное выражение для родительского тега span, чтобы извлечь только цифры.

2 - Используйте функцию decompose(), чтобы удалить дочерний тег span из дерева, а затем извлечь текст, например:

from bs4 import BeautifulSoup

h = """<div style="width:100%; display:inline-block; position:relative; text-
align:center; border-top:thin solid #fff; background-image:linear-
gradient(#333,#000);">
    <div style="width:100%; max-width:1400px; display:inline-block;
position:relative; text-align:left; padding:20px 15px 20px 15px;">
        <a href="/manpower-fit-for-military-service.asp" title="Manpower
Fit for Military Service ranked by country">
            <div class="smGraphContainer"><img class="noBorder"
src="/imgs/graph.gif" alt="Small graph icon"></div>
        </a>
        <span class="textLarge textWhite"><span
class="textBold">FIT-FOR-SERVICE:</span> 18,740,382</span>
    </div>
    <div class="blockSheen"></div>
</div>"""

soup = BeautifulSoup(h, "lxml")
soup.find('span', class_ = "textLarge textWhite").span.decompose()
res = soup.find('span', class_ = "textLarge textWhite").text.strip()

print(res)
#18,740,382
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...