【问题标题】:Extracting text from generic span tag nested within multiple div tags从嵌套在多个 div 标签中的通用 span 标签中提取文本
【发布时间】:2019-06-12 19:46:37
【问题描述】:

我需要获取以下 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 中所示。

【问题讨论】:

  • 你能发布正确的 html 标签来获取值吗?
  • @Kunduk 是的,但我想说明我使用的类选择器包含一些没有 span 标签的 div。那我把不相关的行删掉。

标签: python html beautifulsoup


【解决方案1】:

使用 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

【讨论】:

  • 在尝试使用完整的 HTML 时,我收到错误消息“NoneType 没有属性 find_next”。可能是因为该类的某些 div 不包含 span 标签?
  • 我尝试使用 try/except 块,但最终什么也没打印。
  • 在这种情况下,您可以分享您的网址来查看它。
  • 对不起,我不能分享这个链接,因为它只在内部网络上可用。但是您的代码昨天帮助我找到了答案,所以我将其标记为已接受:)
【解决方案2】:

你总是可以像这样选择一个子标签:

 div = soup.find("div", { "class" : "mvp-collapse-content-box" })
 spans = div.findChildren("span" , recursive=False)
 for span in spans:
    print span

【讨论】:

  • 嗨,在尝试使用完整的 HTML 时,我收到错误“AttributeError:'NoneType' 对象没有属性 'findChildren'”。也许是因为该类的某些 div 不包含 span 标签?我应该使用 try/catch 块来防止这种情况吗?
  • 是的,请务必使用 try/catch。
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多