Findall для идентификации конкретного заголовка на загруженной HTML-странице - PullRequest
0 голосов
/ 09 мая 2019

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

https://www.metacritic.com/browse/games/release-date/coming-soon/all/date

Первая выпущенная игра - «Нерассказанные истории Лавкрафта».Я хочу этот заголовок и распечатать в моем GUI.На странице HTML этот заголовок печатается через тег

.Я использую метод Findall, но он ничего не возвращает.PS Я не могу использовать любую другую библиотеку, включая Beautiful Soap или запросы.Я ограничен в использовании только urllib, findall, finditer, MULTILINE, DOTALL.В настоящее время реализованный фрагмент кода показан ниже.
def game_function():
   game = Tk()
   game.geometry('600x400')
   game.title('Upcoming Video Game Releases')
   game.resizable(0,0)
   opener = urllib.request.FancyURLopener({})
   url = "file:///D:/Riz/Poppie%202/Upcoming%20Video%20Game%20Releases%20for%202019%20-%20Metacritic.html"

  with urllib.request.urlopen(url) as response:
     encoding = response.info().get_param('charset', 'utf8')
     html = response.read().decode(encoding)
  print("",html)
  title_tag = '<h3>(.*)</h3>'
  title_1 = findall(title_tag, html)
  print("",title_1)

  title1_subtitle = Label(game, text = title_1, bg='white', fg='black', font = ('Arial', 14, 'bold'))
  title1_subtitle.place(relx=0.8, rely=0.49)
  title1_subtitle.configure(wraplength='260')

  game.mainloop()

1 Ответ

1 голос
/ 09 мая 2019

Проблема вызвана тем, что внутри тегов h3 есть символы новой строки (\n).В первом аргументе re.findall . означает любой символ, кроме новой строки , если вы не используете re.DOTALL в качестве третьего аргумента.Кроме того, вы должны использовать нежадную версию.Я надеюсь, что следующий пример прояснит это:

import re
txt = '''<h3>
SomeTitle
</h3>
AnotherContent
<h3>
AnotherTitle
</h3>'''
nodotall = re.findall('<h3>(.*)</h3>',txt)
withdotall = re.findall('<h3>(.*)</h3>',txt,re.DOTALL)
nongreedy = re.findall('<h3>(.*?)</h3>',txt,re.DOTALL)
print(nodotall) # [] i.e. nothing found
print(withdotall) # ['\nSomeTitle\n</h3>\nAnotherContent\n<h3>\nAnotherTitle\n'] i.e. everything between first <h3> and last </h3>
print(nongreedy) # ['\nSomeTitle\n', '\nAnotherTitle\n'] i.e. desired output
...