получить с сайта часть текста по найденному слову
Задача на мой взгляд не простая и я не понимаю пока возможно ли это вообще. Я ищу на разных сайта (например: блог, форум, или какой либо другой сайт) определенный текст (например слово 'cmd'). И вот если таковое есть нужно получить кусок предложения например где это слово упоминается. Пока не совсем понимаю как определить это и получить напремер не весь текст а вырезанный любой кусок, чтобы вообще понять небольшую суть где этот текст. Пока вместо текста в результат вывожу ссылку если нашло в ней заданное слово.
Как пример взял сейчас ссылку с этого форума и пытаюсь найти в ней текст который упоинмается несколько раз, и вот нужно вывести результат например 50 символов текста до найденного слова и после него 50 символов текста, конечно если текст в середине оказывается.
Пока что я просто читаю всю страницу и не понимаю как определить текст, не ужели применять парсинг с перебором всех тегов в которые может быть помещен текст?
import urllib.request
url = 'https://ru.stackoverflow.com/questions/1497496/html-%d1%81%d1%82%d1%80%d0%b0%d0%bd%d0%b8%d1%86%d0%b0-%d0%be%d0%b1-%d0%be%d1%82%d1%81%d1%83%d1%82%d1%81%d1%82%d0%b2%d0%b8%d0%b8-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82%d0%b0-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%be-%d0%b3%d1%83%d0%b3%d0%bb%d0%be%d0%b2%d1%81%d0%ba%d0%be%d0%b9'
txt = 'страницу'
soup = str(urllib.request.urlopen(url).read())
if soup.lower().find(txt.lower()) > -1:
print(url)
UPD: Частично разобрался. заменил код на:
import requests
from bs4 import BeautifulSoup
import re
url = 'https://ru.stackoverflow.com/questions/1497496/html-%d1%81%d1%82%d1%80%d0%b0%d0%bd%d0%b8%d1%86%d0%b0-%d0%be%d0%b1-%d0%be%d1%82%d1%81%d1%83%d1%82%d1%81%d1%82%d0%b2%d0%b8%d0%b8-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82%d0%b0-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%be-%d0%b3%d1%83%d0%b3%d0%bb%d0%be%d0%b2%d1%81%d0%ba%d0%be%d0%b9'
txt = 'страницу'
response = requests.get(url)
soup = BeautifulSoup(response.text.lower(), 'lxml')
txt = txt.lower()
items = soup.find(text=re.compile(txt))
if items != None:
print(items)
Осталось понять как получить небольшой кусок текста рядом стоящий, точнее оно выводит рядом стоящий текст, только если он не вгонен в другие теги (типо жирность)
Ответы (1 шт):
простой вариант
import requests
from bs4 import BeautifulSoup
url = 'https://ru.stackoverflow.com/questions/1497496/html-%d1%81%d1%82%d1%80%d0%b0%d0%bd%d0%b8%d1%86%d0%b0-' \
'%d0%be%d0%b1-%d0%be%d1%82%d1%81%d1%83%d1%82%d1%81%d1%82%d0%b2%d0%b8%d0%b8-' \
'%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82%d0%b0-%d0%b2%d0%bc%d0%b5%d1%81%d1%82%d0%be-' \
'%d0%b3%d1%83%d0%b3%d0%bb%d0%be%d0%b2%d1%81%d0%ba%d0%be%d0%b9'
txt = 'страницу'
response = requests.get(url)
soup = BeautifulSoup(response.text.lower(), 'lxml')
items = soup.stripped_strings
for x in items:
if txt in x:
print(x)
print()
# 2
print(*[x for x in soup.stripped_strings if txt in x], sep='\n\n')