Извлечение текста из общего тега span, вложенного в несколько тегов div - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно взять текст (показанный как дата) в следующем фрагменте HTML-кода. Код a1v2v3 меняется в зависимости от страницы, поэтому я не могу использовать его в качестве ссылки или использовать селектор CSS.

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

<div class="mvp-collapse-content-box">
<div data-v-a1v2v3="" class="mvp-row"><div data-v-a1v2v3="" class="mvp-tag mvp-tag-default mvp-tag-checked" style="margin-left: -16px; visibility: hidden;">
<!----> <span class="mvp-tag-text">LIVE</span> 
<!----></div><span data-v-a1v2v3="" style="display: inline-block;">
                  2019.06.12 17:09
                  <br data-v-a1v2v3="">

Полный HTML:

<div class="mvp-collapse-content-box">
<div data-v-a1v2v3="">
<div data-v-a1v2v3="" class="mvp-collapse mvp-collapse-simple">
<div data-v-a1v2v3="" class="mvp-collapse-item mvp-collapse-item-active" style="padding-left: 6px;">
<div class="mvp-collapse-header">
<!----> <div data-v-a1v2v3="" class="mvp-row-flex mvp-row-flex-middle">
<div data-v-a1v2v3="" class="mvp-col mvp-col-span-18 mvp-col-span-xs-16 mvp-col-span-sm-18 mvp-col-span-md-18 mvp-col-span-lg-18"><div data-v-a1v2v3="" class="mvp-tag mvp-tag-blue mvp-tag-checked" style="margin-left: -16px;">
<!----> <span class="mvp-tag-text mvp-tag-color-white">LIVE</span> 
<!----></div><div data-v-a1v2v3="" class="versionAndMemo">
<span data-v-a1v2v3="" style="display: inline-block; line-height: 26px; vertical-align: middle; margin: 0px 1px; font-weight: bold; font-size: 14px;">1.2.3.44</span>
<!----></div></div>
<div data-v-a1v2v3="" class="mvp-col mvp-col-span-6 mvp-col-span-xs-8 mvp-col-span-sm-6 mvp-col-span-md-6 mvp-col-span-lg-6"><div data-v-a1v2v3="" style="display: inline-block; float: right; margin-right: 6px;"><i data-v-a1v2v3="" class="lal la-download" style="font-size: 1.8em; margin-top: 8px; display: table-cell; vertical-align: middle;"></i></div>
<div data-v-a1v2v3="" style="float: right; margin-right: 22px;"><i data-v-a1v2v3="" class="lal la-link" style="font-size: 1.8em; margin-top: 8px; display: table-cell; vertical-align: middle;"></i></div></div></div></div> <div class="mvp-collapse-content" style="" data-old-padding-top="" data-old-padding-bottom="" data-old-overflow="">
<div class="mvp-collapse-content-box">
<div data-v-a1v2v3="" class="mvp-row"><div data-v-a1v2v3="" class="mvp-tag mvp-tag-default mvp-tag-checked" style="margin-left: -16px; visibility: hidden;">
<!----> <span class="mvp-tag-text">LIVE</span> 
<!----></div><span data-v-a1v2v3="" style="display: inline-block;">
                  2019.06.12 17:09
                  <br data-v-a1v2v3="">

Вот что у меня есть:

        page = requests.get(app, headers=headers, cookies=cookies).text
        soup = BeautifulSoup(page, 'html.parser')

        for spantime in  soup.findAll("div", {"class": "mvp-collapse-content-box"}):
            print(spantime)

Но ничего не печатается. Я также попытался добавить следующее:

        page = requests.get(app, headers=headers, cookies=cookies).text
        soup = BeautifulSoup(page, 'html.parser')

        for spantime in  soup.findAll("div", {"class": "mvp-collapse-content-box"}):

            print(spantime.text)
            for span in  spantime.find_all('span', recursive=True):
                print(span.text)

Но ни один из них ничего не печатает. У меня есть ощущение, что это может быть связано с классом mvp-collapse-content-box, который я использовал - некоторые теги div с этим классом не обязательно имеют теги span, как показано в полном HTML.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Используйте find_next (), чтобы найти тег span и использовать свойство text.

from bs4 import BeautifulSoup
html='''<div class="mvp-collapse-content-box">
<div data-v-a1v2v3="" class="mvp-row"><div data-v-a1v2v3="" class="mvp-tag mvp-tag-default mvp-tag-checked" style="margin-left: -16px; visibility: hidden;">
<!----> <span class="mvp-tag-text">LIVE</span> 
<!----></div><span data-v-a1v2v3="" style="display: inline-block;">
                  2019.06.12 17:09
                  <br data-v-a1v2v3="">'''

soup=BeautifulSoup(html,'html.parser')
div=soup.find('div',class_="mvp-collapse-content-box")
print(div.find_next('span').find_next('span').text.strip())

Вывод:

2019.06.12 17:09
0 голосов
/ 12 июня 2019

Вы всегда можете выбрать дочерний тег следующим образом:

 div = soup.find("div", { "class" : "mvp-collapse-content-box" })
 spans = div.findChildren("span" , recursive=False)
 for span in spans:
    print span
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...