Если вы знаете, что дата всегда последний текстовый узел в переменном заголовке, то вы можете получить доступ к .contents
property и получить последний элемент в возвращаемом списке:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
header = soup.find('p')
header.contents[-1].strip()
> February 11, 2017
Или, как MYGz pointed out in the comments below, вы может разделить текст на новые линии и получить последний элемент в списке:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
header = soup.find('p')
header.text.split('\n')[-1]
> February 11, 2017
Если вы не знаете, положение даты текстового узла, затем Другим вариантом было бы, чтобы разобрать любые подходящие строки:
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(html, 'html.parser')
header = soup.find('p')
re.findall(r'\w+ \d{1,2}, \d{4}', header.text)[0]
> February 11, 2017
Однако, как ваше название подразумевает, если вы только хотите, чтобы извлечь текстовые узлы, которые не обернуты с тега элемента, то вы могли бы использовать следующие, которые будут отфильтровывать элементы:
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(html, 'html.parser')
header = soup.find('p')
text_nodes = [e.strip() for e in header if not e.name and e.strip()]
Имейте в виду, что будет возвращать следующие с первого текстового узла не обернута:
> ['Andrew Anglin', 'February 11, 2017']
Конечно, вы могли бы также объединить два последних варианта и разобрать строки даты в возвращенных текстовых узлов:
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(html, 'html.parser')
header = soup.find('p')
for node in header:
if not node.name and node.strip():
match = re.findall(r'^\w+ \d{1,2}, \d{4}$', node.strip())
if match:
print(match[0])
> February 11, 2017
Вы должны предоставить больше вашего HTML. Этого можно добиться даже без BeautifulSoup. 'Html.split ('\ п') [- 1] [: - 4]' – MYGz