有没有办法找到 class 名称并获取 parent 标签的整个文本?

Is there a way to find class name and take the whole text of parent tag?

我有很多 html 个文件,我必须获取完整的 header 个文件。 header 的标签位置不同:class="c6"、class="c7"

我试过了BeautifulSoup

for head_c6 in soup.find_all('span', attrs={'class': 'c6'}):
        print(head_c6.get_text())
for head_c7 in soup.find_all('span', attrs={'class': 'c7'}):
        print(head_c7.get_text())

但结果:

2017 年第三季度美国运通联合财报电话会议 - 最终 长度:

2016 年第 2 季度 Akamai Technologies Inc 电话会议 - 最终 收益

不同文件的外观如下:

文件 1

<div class="c4">
<p class="c5">
<span class="c6">
      Q3 2017 American Express Co Earnings Call - Final
     </span>
</p>
</div>
<div class="c4">
<p class="c5">
<span class="c7">
      LENGTH:
     </span>
<span class="c2">
      11051 words
     </span>
</p>
</div>

文件 2

<div class="c4">
<p class="c5">
<span class="c6">
      Q2 2018 Akamai Technologies Inc
     </span>
<span class="c7">
      Earnings
     </span>
<span class="c6">
      Call - Final
     </span>
</p>
</div>

文件 3

<div class="c4">
    <p class="c5">
     <span class="c6">
      Q4 2018
     </span>
     <span class="c7">
      Facebook
     </span>
     <span class="c6">
      Inc
     </span>
     <span class="c7">
      Earnings
     </span>
     <span class="c6">
      Call - Final
     </span>
    </p>

我想要的是获取header的全文:

2017 年第三季度美国运通联合财报电话会议 - 最终

2018 年第二季度 Akamai Technologies Inc 财报​​电话会议 - 最终

Facebook Inc 2018 年第 4 季度财报电话会议 - 最终

使用正则表达式re我已经更新了最后一个文件html.You可以对剩余的文件做同样的事情

from bs4 import BeautifulSoup
import re
data='''<div class="c4">
    <p class="c5">
     <span class="c6">
      Q4 2018
     </span>
     <span class="c7">
      Facebook
     </span>
     <span class="c6">
      Inc
     </span>
     <span class="c7">
      Earnings
     </span>
     <span class="c6">
      Call - Final
     </span>
    </p>'''

soup=BeautifulSoup(data,'html.parser')

items=[item.text.strip() for item in soup.find_all('span', class_=re.compile("c"))]
stritem=' '.join(items)
print(stritem.replace('\n',''))

输出:

 Q4 2018 Facebook Inc Earnings Call - Final

您也可以使用以下方式

items=[item.text.strip() for item in soup.find_all('span', class_=re.compile("c6|c7"))]
stritem=' '.join(items)
print(stritem.replace('\n',''))

或尝试获取父标签文本。

from bs4 import BeautifulSoup
import re
data='''<div class="c4">
    <p class="c5">
     <span class="c6">
      Q4 2018
     </span>
     <span class="c7">
      Facebook
     </span>
     <span class="c6">
      Inc
     </span>
     <span class="c7">
      Earnings
     </span>
     <span class="c6">
      Call - Final
     </span>
    </p>'''

soup=BeautifulSoup(data,'html.parser')
childtag=soup.find('span', class_=re.compile("c6|c7"))
parenttag=childtag.parent
print(parenttag.text.replace('\n',''))

strip() in-built Python 函数用于删除字符串中的所有前导和尾随空格。

str.join(iterable) - Return 一个字符串,它是 iterable 中字符串的串联。

from bs4 import BeautifulSoup

html1 = ''' <div class="c4">
    <p class="c5">
     <span class="c6">
      Q4 2018
     </span>
     <span class="c7">
      Facebook
     </span>
     <span class="c6">
      Inc
     </span>
     <span class="c7">
      Earnings
     </span>
     <span class="c6">
      Call - Final
     </span>
    </p></div>'''

soup = BeautifulSoup(html1,'lxml')
tag =  soup.find('div',{'class':'c4'})
header = ' '.join(("".join((tag.text.strip()).split('\n'))).split())
print(header)

O/P

Facebook Inc 2018 年第 4 季度财报电话会议 - 最终

将 Or 列表传递给 select

似乎更容易、更有效
from bs4 import BeautifulSoup as bs

html = '''<div class="c4">
    <p class="c5">
     <span class="c6">
      Q4 2018
     </span>
     <span class="c7">
      Facebook
     </span>
     <span class="c6">
      Inc
     </span>
     <span class="c7">
      Earnings
     </span>
     <span class="c6">
      Call - Final
     </span>
    </p>'''

soup= bs(html,'html.parser')  
result = ' '.join([item.text.strip() for item in soup.select('.c6,.c7')])
print(result)