嗨,我正在用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)
答案 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))
我的输出:(是法语...)
Lesévadés
束缚
黑暗骑士:黑色骑士骑士
二人组的小伙子们
Le seigneur des anneaux:路易之路
列表继续...