如何在Python中使用正则表达式解析前250个电影标题

时间:2019-02-27 21:16:01

标签: python regex

嗨,我正在用Python练习正则表达式,以解析IMDb中的top250电影的标题,但是我很难在两个标签之间搜索内容,例如: The Godfather

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 :(得分:2)

正如评论中指出的那样,您最好尝试使用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个。

答案 1 :(得分:0)

这是一个可行的解决方案,同时使用BeautifulSoup和一些讨厌的正则表达式,但效果很好。我喜欢regex,但似乎我以一种怪异的方式制作它们,如果您愿意,我可以向您解释它们的工作原理。

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. 束缚

  3. 黑暗骑士:黑色骑士骑士

  4. 二人组的小伙子们

  5. Le seigneur des anneaux:路易之路

列表继续...