在没有外部模块的网站上查找信息

Posted

技术标签:

【中文标题】在没有外部模块的网站上查找信息【英文标题】:Finding information on a website without an external module 【发布时间】:2014-05-09 03:44:23 【问题描述】:

我正在用 Python 创建一个程序,您可以在其中搜索电视节目/电影,并从 IMDb 中为您提供:

电影的标题、年份、分级、年龄分级和剧情简介。

我想完全不使用外部模块,只使用 Python 3.4 附带的那些。

我知道我将不得不使用 urllib,但我不知道从那里去哪里。

我该怎么做?

【问题讨论】:

为什么要随意限制?到目前为止,您自己尝试过什么?您对 html 解析了解多少,您是否看过 IMDb 是否提供 API? Does IMDB provide an API? 列出了几个选项,您只需导入 json 模块来处理返回的数据。 我使用了this,并要求用户输入电影名称。然后我做url = urllib.request.urlopen("http://www.omdbapi.com/?t="+title+"&r=XML"),我将如何从那里提取信息? 【参考方案1】:

这可能太复杂了,但是: 我看网页代码。我查看我想要的信息在哪里,然后提取信息。

    import urllib.request

def search(title):
    html = urllib.request.urlopen("http://www.imdb.com/find?q="+title).read().decode("utf-8")
    f=html.find("<td class=\"result_text\"> <a href=\"",0)+34
    openlink=""
    while html[f]!="\"":
        openlink+= html[f]
        f+=1
    html = urllib.request.urlopen("http://www.imdb.com"+openlink).read().decode("utf-8")
    f = html.find("<meta property='og:title' content=\"",0)+35
    titleyear=""
    while html[f] !="\"":
        titleyear+=html[f]
        f+=1

    f = html.find("title=\"Users rated this ",0)+24
    rating = ""
    while html[f] !="/":   
        rating+= html[f]
        f+=1

    f=html.find("<meta name=\"description\" content=\"",0)+34
    shortdescription = ""
    while html[f] !="\"":
        shortdescription+=html[f]
        f+=1
    print (titleyear,rating,shortdescription)
    return (titleyear,rating,shortdescription)
search("friends")

添加到 f 的数字必须恰到好处,您计算正在搜索的字符串的长度,因为 find() 会返回字符串中第一个字母的位置。

看起来很糟糕,还有其他更简单的方法吗?

【讨论】:

【参考方案2】:

这是取自from here的例子:

import json
from urllib.parse import quote
from urllib.request import urlopen

def search(title):
    API_URL = "http://www.omdbapi.com/?r=json&s=%s"
    title = title.encode("utf-8")
    url = API_URL % quote(title)
    data = urlopen(url).read().decode("utf-8")
    data = json.loads(data)
    if data.get("Response") == "False":
        print(data.get("Error", "Unknown error"))

    return data.get("Search", [])

那么你可以这样做:

>>> search("Idiocracy")
['Year': '2006', 'imdbID': 'tt0387808', 'Title': 'Idiocracy']

【讨论】:

哇,谢谢。当我尝试让用户输入电影名称时,我输入search(movieTitle),它不会加载信息。有没有办法做到这一点?另外,有没有加载评级等? "它不加载信息"??什么信息?你有错误吗? 当我让用户输入电影名称时,它不会打印出['Year': '2006', 'imdbID': 'tt0387808', 'Title': 'Idiocracy'] 这表明您的代码接受用户输入存在问题。

以上是关于在没有外部模块的网站上查找信息的主要内容,如果未能解决你的问题,请参考以下文章

如何为内容/样式发生一些变化的外部网站提供服务?

获取公共/外部 IP 地址?

将查看次数添加到网站上的外部链接

在活动网站中检索外部 torrent 统计信息的最佳方式

如何将外部服务器上的网站连接到本地主机上通过 Xaamp 运行的数据库?

求助!怎样向别人的网站提交表单并返回信息?