Как разобрать название 250 лучших фильмов, используя регулярные выражения в Python - PullRequest
0 голосов
/ 28 февраля 2019

Привет. Я практикую регулярное выражение на Python, чтобы разобрать названия топ-250 фильмов из IMDb, но у меня возникают трудности с поиском содержимого между двумя тегами, такими как: Крестный отец

import re, urllib.request
def movie(url):
    web_page = urllib.request.urlopen(url)
    lines = web_page.read().decode(errors = "replace")
    web_page.close()
    return re.findall('(?<=<a href=")/title.*?">.+?(?=</a>)', lines, re.DOTALL)
title = movie("https://www.imdb.com/search/title?groups=top_250&sort=user_rating")
for name in title:
    print(name)

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

это рабочее решение, использующее BeautifulSoup и некоторое неприятное регулярное выражение, но оно работает нормально.Я люблю регулярные выражения, но кажется, что я делаю их странным образом, я могу объяснить вам, как они работают, если хотите.

import re, urllib.request
from bs4 import BeautifulSoup

url = "https://www.imdb.com/search/title?groups=top_250&sort=user_rating"
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
i = 0
for txt in soup.findAll(attrs={"class" :"lister-item-header"}):
    i += 1
    print(str(i) + " ." + re.match("""^.*>(.*)</a>.*$""", re.sub('"', '', re.sub('\n', '', str(txt)))).group(1))

Мой вывод: (это французский ...)

  1. Les évadés

  2. Le parrain

  3. Темный рыцарь: Le chevalier noir

  4. Le parrain, 2ème partie

  5. Le seigneur des anneaux: Le retour du roi

И этот список можно продолжить ...

0 голосов
/ 28 февраля 2019

Как указано в комментариях, вам лучше попробовать BeautifulSoup.Примерно так будет перечисляться названия в Python3:

import requests
from bs4 import BeautifulSoup

html = requests.get('https://www.imdb.com/search/title?groups=top_250&sort=user_rating')
if html.ok:
    soup = BeautifulSoup(html.text, 'html.parser')
    html.close()

for title in soup('h3', 'lister-item-header'):
    print(title('a')[0].get_text())

А вот более чистая версия кода выше:

import requests
from bs4 import BeautifulSoup

imdb_entry_point = 'https://www.imdb.com/search/title'
imdb_payload = {
    'groups': 'top_250',
    'sort': 'user_rating'
}

with requests.get(imdb_entry_point, imdb_payload) as imdb:
    if imdb.ok:
        html = BeautifulSoup(imdb.text, 'html.parser')
        for i, h3 in enumerate(html('h3', 'lister-item-header'), 1):
            for a in h3('a'):
                print(i, a.get_text())

Кстати, эта точка входа возвращает только 50 результатова не 250, как вы ожидаете.

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