【问题标题】:Parse HTML from local file从本地文件解析 HTML
【发布时间】:2015-07-15 15:58:21
【问题描述】:

我正在使用带有 Python 的 Google App Engine。我想从与我的 Python 脚本相同的项目中获取 HTML 文件的树。我尝试了很多东西,比如使用绝对 url(例如http://localhost:8080/nl/home.html)和相对 url(/nl/home.html)。两者似乎都不起作用。我使用此代码:

class HomePage(webapp2.RequestHandler):    
    def get(self):

        path = self.request.path

        htmlfile = etree.parse(path)
        template = jinja_environment.get_template('/nl/template.html')

        pagetitle = htmlfile.find(".//title").text
        body = htmlfile.get_element_by_id("body").toString()

它返回以下错误: IOError:读取文件“/nl/home.html”时出错:无法加载外部实体“/nl/home.html

有谁知道如何使用 Python 从同一个项目中获取 HTML 文件的树?

编辑

这是工作代码:

class HomePage(webapp2.RequestHandler):    
def get(self):

    path = self.request.path.replace("/","",1)
    logging.info(path)

    htmlfile = html.fromstring(urllib.urlopen(path).read())   
    template = jinja_environment.get_template('/nl/template.html')

    pagetitle = htmlfile.find(".//title").text
    body = innerHTML(htmlfile.get_element_by_id("body"))

def innerHTML(node): 
    buildString = ''
    for child in node:
        buildString += html.tostring(child)
    return buildString

【问题讨论】:

    标签: python html google-app-engine lxml


    【解决方案1】:

    似乎是权限问题;检查您的 python 脚本是否可以访问该文件。如果您将该文件提供给所有人,它会起作用吗?

    【讨论】:

    • 我在 app.yaml 文件中添加了以下代码: - url: /nl static_dir: nl application_readable: true 但不幸的是它仍然无法正常工作
    【解决方案2】:

    我相信您的错误出在文件的路径中。您假设您的应用程序目录是服务器上文件系统的根目录。不必如此。实际上,我找不到任何关于文件位置的文档,所以这就是我所做的(它在开发服务器上工作,我还没有在生产中厌倦它):

    我假设 Google 会在我的应用程序中保留文件的相对位置。因此,如果我知道一个文件的位置,我就可以确定其余文件的位置。幸运的是,python 规范允许您以编程方式确定 python 源文件的位置,如下所示:

    def get_src_dir(){
        return os.path.dirname(os.path.realpath(__file__))
    }
    

    get_src_dir() 你会得到源文件的位置。

    os.path.join(get_src_dir(), rel_path_to_asset)
    

    现在将为您提供资产路径。 rel_path_to_asset 是相对于 get_src_dir() 函数所在的源文件的资产路径...

    【讨论】:

      【解决方案3】:

      您的工作目录是您的应用程序目录的基础。因此,如果您的应用是这样组织的:

      • app.yaml
      • nl/
        • home.html

      然后您可以在nl/html.html 阅读您的文件(假设您没有更改您的工作目录)。

      【讨论】:

      • 这是否记录在某处?工作目录是应用程序目录的基础吗?我找不到任何关于它的具体信息,所以我使用我的答案中描述的机制来获取我的应用程序文件的路径......
      • 我找不到正式的文档,但它在Using Templates 页面上作为提示被提及。
      • 好的,这是我对 Google 的期望的一个很好的文档(没有冒犯,但说真的,文档怎么这么糟糕......)。
      • 谢谢,这对我帮助很大!最终,必须对我的代码进行更多编辑,请参阅我的问题以了解工作代码。
      猜你喜欢
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多