#python #web-scraping
Вопрос:
Это выглядит довольно просто, но мне так и не удалось найти решение. Я попробовал другие предложенные решения, например: span.clear()
но не сделал этого.
Структура Web:
<div class="details">
<h2>Public function</h2>
<div class="token">
<h2>Name person</h2>
<h3>Name person</h3>
<p>
<span>NO</span>NO</p>
<p>
<span>Time of Death:</span>13:38:00</p>
Результат:
Time of Death: 13:38:00
Желаемый результат:
13:38:00
Мой код:
whole_section = soup.find('div', {'class':"token"}) # Access to whole section
name_person = whole_section.h2.text # Select person's name, inside "h2" tag.
time_decease = whole_section.h3.next_sibling.next_sibling.next_sibling.next_sibling.text # Because ther's no tag, I'd to use "next_sibling".
Ответ №1:
Я бы никогда не рекомендовал обходить DOM, неоднократно пытаясь получить следующий sibling — по моему опыту, каждый раз, когда вы это делаете, ваш скрипт становится все более и более подверженным сбоям из-за малейших изменений в исходном HTML.
Вместо этого найдите родительский <p></p>
элемент, который вам нужен, используя lambda
функцию для фильтрации на основе содержимого <p></p>
самого элемента ( 'Time of Death:'
в частности, строки); затем перебирайте дочерние элементы этого <p></p>
элемента и удаляйте <span></span>
, чтобы извлечь то, что вам нужно:
html = '''<div class="details">
<h2>Public function</h2>
<div class="token">
<h2>Name person</h2>
<h3>Name person</h3>
<p>
<span>NO</span>NO</p>
<p>
<span>Time of Death:</span>13:38:00</p>
</div>
</div>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
whole_section = soup.find('div', {'class':"token"}) # Access to whole section
name_person = whole_section.h2.text # Select person's name, inside "h2" tag.
time_decease = whole_section.find(lambda element: element.name == 'p' and 'Time of Death:' in element.text)
for span in time_decease.find_all('span'):
span.decompose()
print(name_person)
print(time_decease.text)
Комментарии:
1. Ваше решение работает, но когда я пытаюсь реализовать тот же метод для получения другого интересующего меня содержимого, оно ломается. После 4-го цикла фильтрации в нем говорится: «AttributeError: объект ‘NoneType’ не имеет атрибута’find_all'». Странно то, что он может получить пару содержимого, прежде чем отобразит предыдущее сообщение об ошибке. Вы знаете, почему?
2. Вероятно, он ломается, потому что он специально разработан для примера, который вы указали в своем первоначальном вопросе. Вы не сможете просто применить его один к одному к другим случаям, не выполнив некоторые настройки. Не видя точно , каковы ваши варианты использования, я не могу » знать, почему «. Обновите свой вопрос, включив в него эту соответствующую информацию, что вы пробовали для каждого сценария и где вы застреваете для каждого.
3. Если мне не удастся найти решение самостоятельно, я задам другой вопрос. Спасибо. Я спрашивал, потому что другие случаи точно такие же, как в примере (просто СКОПИРУЙТЕ и ВСТАВЬТЕ все после тега h3). Я приму ваш ответ.