Я использую BeautifulSoup для разбора файлов HTML. У меня есть HTML-файл, похожий на этот:

<h3>Unimportant heading</h3>
<table class="foo">
  <tr>
    <td>Key A</td>
  </tr>
  <tr>
    <td>A value I don't want</td>
  </tr>
</table>


<h3>Unimportant heading</h3>
<table class="foo">
  <tr>
    <td>Key B</td>
  </tr>
  <tr>
    <td>A value I don't want</td>
  </tr>
</table>


<h3>THE GOOD STUFF</h3>
<table class="foo">
  <tr>
    <td>Key C</td>
  </tr>
  <tr>
    <td>I WANT THIS STRING</td>
  </tr>
</table>


<h3>Unimportant heading</h3>
<table class="foo">
  <tr>
    <td>Key A</td>
  </tr>
  <tr>
    <td>A value I don't want</td>
  </tr>
</table>

Я хочу извлечь строку "Я ХОЧУ ЭТУ СТРОКУ". Идеальным решением было бы получить первую таблицу после заголовка h3 под названием «ХОРОШИЙ ПЕРСОНАЛ» . Я понятия не имею, как это сделать с BeautifulSoup - я знаю только, как извлечь таблицу с определенным классом или таблицу , вложенную в некоторый определенный тег, но не follow конкретный тег.

Я думаю, что в качестве альтернативного решения можно использовать строку «Ключ C», предполагая, что она уникальна (почти наверняка есть) и появляется только в одной таблице, но я бы чувствовал себя лучше, перейдя к определенному заголовку h3.

3
Alexander Engelhardt 20 Авг 2018 в 20:42

3 ответа

Лучший ответ

Следуя логике ответа @ Zroq на другой вопрос, этот код даст вам таблицу, следующую за вашим определенным заголовком («ХОРОШО» STUFF " ) . Обратите внимание, я просто поместил все ваши HTML в переменную с именем "HTML".

from bs4 import BeautifulSoup, NavigableString, Tag

soup=BeautifulSoup(html, "lxml")

for header in soup.find_all('h3', text=re.compile('THE GOOD STUFF')):
    nextNode = header
    while True:
        nextNode = nextNode.nextSibling
        if nextNode is None:
            break
        if isinstance(nextNode, Tag):
            if nextNode.name == "h3":
                break
            print(nextNode)

Выход:

<table class="foo">
<tr>
<td>Key C</td>
</tr>
<tr>
<td>I WANT THIS STRING</td>
</tr>
</table>

Ура!

2
Hoenie 20 Авг 2018 в 18:19

документы объясняют, что если вы не хотите использовать {{X0 }}, ты можешь это сделать:

for sibling in soup.a.next_siblings:
    print(repr(sibling))
0
J_H 20 Авг 2018 в 17:48

Я уверен, что есть много способов сделать это более эффективно, но вот о чем я могу думать прямо сейчас:

from bs4 import BeautifulSoup
import os
os.chdir('/Users/Downloads/')
html_data = open("/Users/Downloads/train.html",'r').read()
soup = BeautifulSoup(html_data, 'html.parser')
all_td = soup.find_all("td")
flag = 'no_print'
for td in all_td:
    if flag == 'print':
        print(td.text)
        break
    if td.text == 'Key C':
        flag = 'print'

Выход:

I WANT THIS STRING
0
Leo_28 20 Авг 2018 в 18:31
51935973