Как найти теги включения (начальный и конечный тег) после поиска определенного ключевого слова в файле HTML? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть список ключевых слов, которые мне нужно найти на веб-сайте.Сначала я извлек содержимое веб-страницы с помощью BeautifulSoup и сохранил его в текстовом файле.Я хочу найти список ключевых слов в текстовом файле (который содержит данные HTML), и, когда одно из ключевых слов совпадает, необходимо извлечь соответствующие начальный и конечный теги, в которых было найдено ключевое слово.
Например-

<div class="col-md-6">
<a href="/"><img alt="DC Sustainable Energy Utility: Your Guide to Green" class="img-fluid" src="//d2z33q8cpwfp3p.cloudfront.net/content/dcseu-temp.png"/></a>
</div>

Я ищу слово «Энергия» и нахожу его в теге «img», НО, я хочу извлечь родительский тег, который здесь называется «div».Есть ли способ, которым я могу это сделать?

from bs4 import BeautifulSoup
import urllib

#Extracting HTML content from a webpage

webUrl = urllib.request.urlopen("URL")
html_doc = webUrl.read()
soup = BeautifulSoup(html_doc, 'html.parser')
soup = str(soup)
with open('path to .txt file', 'w') as output:
    output.write(soup)

#Extracting start and end tag
from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()
parser.feed('<div class="col-md-6"><a href="/"><img alt="Some Energy Utility: " class="img-fluid" src="//some_image.png"/></a></div>')

Это идентифицирует все начальные и конечные теги, но я хочу иметь возможность извлечь родительские / основные теги, которые содержат ключевое слово.

1 Ответ

0 голосов
/ 01 июля 2019

Вы можете найти элементы с определенным текстом или img s с определенным alt текстом, используя пользовательский фильтр, а затем найти ближайшего родителя типа div (или любого другого критерия .find_*, принимающего методы)

from bs4 import BeautifulSoup, Tag

html = '''
<div class="col-md-6">
<a href="/"><img alt="DC Sustainable Energy Utility: Your Guide to Green" class="img-fluid" src="//d2z33q8cpwfp3p.cloudfront.net/content/dcseu-temp.png"/></a>
</div>
'''

keyword = 'energy'

if __name__ == '__main__':
    soup = BeautifulSoup(html, 'html.parser')


    def keyword_filter(el: Tag):
        """Pick a tag according to its text content"""
        if keyword.lower() in el.text.lower():
            return True
        try:
            if keyword.lower() in el['alt'].lower():
                return True
        except KeyError:
            return False
        return False


    for el in soup.find_all(keyword_filter):
        div = el.find_parent('div')
        print(div)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...