Есть ли способ найти имя класса и взять весь текст родительского тега? - PullRequest
2 голосов
/ 14 мая 2019

У меня много html-файлов, и я должен взять полный заголовок файлов.Теги заголовков расположены по-разному: 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())

, но результат:

Q3 2017 American ExpressВызов Co Co - Финал ДЛИНА:

Q2 2016 Вызов 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>

Я хочу получить полный текст заголовка:

Выручка по программе American Express Co за 3 квартал 2017 года - финал

Доходы Akamai Technologies Inc за 2 квартал 2018 годаВызов - финал

Q4 2018 Facebook Inc Доход заработок Вызов - финал

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

strip () Встроенная функция Python используется для удаления всех начальных и конечных пробелов из строки.

str.join (повторяемая) - Вернуть строку, которая является конкатенацией строк в итерируемой.

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

Q4 2018 Facebook Inc Call Earnings Call - Final

0 голосов
/ 14 мая 2019

Кажется, проще и эффективнее передать список или выбрать

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)
0 голосов
/ 14 мая 2019

Использовать регулярное выражение re Я обновил последний файл html. Вы можете сделать то же самое с остальными файлами

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',''))
...