2017-02-11 7 views
1

У меня есть следующий переменный, header равно:BeautifulSoup: Извлечь текст, который не является в данном теге

<p>Andrew Anglin<br/> 
<strong>Daily Stormer</strong><br/> 
February 11, 2017</p> 

Я хочу, чтобы извлечь из этих переменных только даты February 11, 2017. Как это сделать, используя BeautifulSoup в python?

+0

Вы должны предоставить больше вашего HTML. Этого можно добиться даже без BeautifulSoup. 'Html.split ('\ п') [- 1] [: - 4]' – MYGz

ответ

1

Если вы знаете, что дата всегда последний текстовый узел в переменном заголовке, то вы можете получить доступ к .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 

 Смежные вопросы

  • Нет связанных вопросов^_^