Используйте BeautifulSoup для извлечения текста в заголовке Speci c - PullRequest
1 голос
/ 23 февраля 2020

Как извлечь весь текст ниже заголовка c? В этом случае мне нужно извлечь текст под Topic 2. РЕДАКТИРОВАТЬ: На других веб-страницах "Topi c 2" иногда появляется в качестве третьего заголовка или первого. «Topi c 2» не всегда находится в одном и том же месте и не всегда имеет одинаковый идентификационный номер.

# import library
from bs4 import BeautifulSoup

# dummy webpage text
body = '''
<h2 id="1">Topic 1</h2>
<p> This is the first sentence.</p>
<p> This is the second sentence.</p>
<p> This is the third sentence.</p>

<h2 id="2">Topic 2</h2>
<p> This is the fourth sentence.</p>
<p> This is the fifth sentence.</p>

<h2 id="3">Topic 3</h2>
<p> This is the sixth sentence.</p>
<p> This is the seventh sentence.</p>
<p> This is the eighth sentence.</p>
'''

# convert text to soup 
soup = BeautifulSoup(body, 'lxml')

Если я извлекаю текст только под '' 'Topi c 2 '' ', это мой вывод.

This is the fourth sentence. This is the fifth sentence.

Мои попытки решить эту проблему:

Я пытался soup.select('h2 + p'), но это только дайте мне первые предложения под каждым заголовком.

[<p> This is the first sentence.</p>,
 <p> This is the fourth sentence.</p>,
 <p> This is the sixth sentence.</p>]

Я тоже попробовал это, но он дал мне весь текст, когда мне нужен только текст под Topic 2:

import pandas as pd 

lst = []
for row in soup.find_all('p'):
    text_dict = {}
    text_dict['text'] = row.text
    lst.append(text_dict)

df = pd.DataFrame(lst) 

df

|   | text                          |
|---|-------------------------------|
| 0 | This is the first sentence.   |
| 1 | This is the second sentence.  |
| 2 | This is the third sentence.   |
| 3 | This is the fourth sentence.  |
| 4 | This is the fifth sentence.   |
| 5 | This is the sixth sentence.   |
| 6 | This is the seventh sentence. |
| 7 | This is the eighth sentence.  |

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Попробуйте:

target = soup.find('h2',text='Topic 2')
for sib in target.find_next_siblings():
    if sib.name=="h2":
        break
    else:
        print(sib.text)

Вывод (от вас html выше):

 This is the fourth sentence.
 This is the fifth sentence.
0 голосов
/ 23 февраля 2020

Проблема в том, что вы думаете, что текст у нас под заголовком. Технически, текстовые узлы являются родственными элементами заголовков, поэтому единственный способ получить их - это более последовательный процесс итерации по дочерним элементам:

  1. найти заголовок
  2. найти все, кроме заголовка & извлекать текст
  3. найти другой заголовок (или EOF) и остановиться.

Больше похоже на:

h2 = soup.find('h2', id='2')
for sibling in h2.next_siblings:
   if sibling.name != (None, 'p'):
      break;
   # ... do what you like with the <p> node

(Обратите внимание, что у BeautifulSoup есть брат

является строковым элементом, обычно переводом строки, name == None, поэтому убедитесь, что вы правильно его обрабатываете или игнорируете.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...