【问题标题】:Python: find <title>Python:查找 <title>
【发布时间】:2010-05-20 10:02:15
【问题描述】:

我有这个:

response = urllib2.urlopen(url)
html     = response.read()

begin = html.find('<title>')
end   = html.find('</title>',begin)
title = html[begin+len('<title>'):end].strip()

如果 url = http://www.google.com 那么标题作为“Google”没有问题,

但是如果 url = "http://www.britishcouncil.org/learning-english-gateway" 那么标题就变成了

"<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<base href="http://www.britishcouncil.org/" />
<META http-equiv="Content-Type" Content="text/html;charset=utf-8">
<meta name="WT.sp" content="Learning;Home Page Smart View" />
<meta name="WT.cg_n" content="Learn English Gateway" />
<META NAME="DCS.dcsuri" CONTENT="/learning-english-gateway.htm">..."

实际发生了什么,为什么我不能返回“标题”?

【问题讨论】:

    标签: python html string


    【解决方案1】:

    该 URL 返回带有 &lt;TITLE&gt;...&lt;/TITLE&gt;find 的文档区分大小写。我强烈建议您使用像 Beautiful Soup 这样的 HTML 解析器。

    【讨论】:

      【解决方案2】:

      让我们分析一下为什么我们会得到这个答案。如果您打开网站并查看源代码,我们注意到它没有&lt;title&gt;...&lt;/title&gt;。相反,我们有&lt;TITLE&gt;...&lt;/TITLE&gt;。那么 2 个 find 调用发生了什么?两者都是-1

      begin = html.find('<title>')   # Result: -1
      end   = html.find('</title>')  # Result: -1
      

      那么begin+len('&lt;title&gt;') 将是-1 + 7 = 6。所以你的最后一行将提取html[6:-1]。事实证明,负索引在 Python 中实际上意味着一些合法的东西(有充分的理由)。意思是从后面数。因此,这里的 -1 指的是 html 中的最后一个字符。所以你得到的是从第 6 个字符(包括)到最后一个字符(不包括)的子字符串。

      那我们能做什么呢?好吧,一方面,您可以使用忽略大小写的正则表达式匹配器或使用适当的 HTML 解析器。如果这是一次性的事情并且空间/性能不是什么大问题,最快的方法可能是创建html 的副本并将整个字符串小写:

      def get_title(html):
          html_lowered = html.lower();
          begin = html_lowered.find('<title>')
          end = html_lowered.find('</title>')
          if begin == -1 or end == -1:
              return None
          else:
              # Find in the original html
              return html[begin+len('<title>'):end].strip()
      

      【讨论】:

        【解决方案3】:

        使用 Python 3 使用 lxml 和 urllib 的工作解决方案

        import lxml.etree, urllib.request
        
        def documenttitle(url):
            conn = urllib.request.urlopen(url)
            parser = lxml.etree.HTMLParser(encoding = "utf-8")
            tree = lxml.etree.parse(conn, parser = parser)
            return tree.find('.//title')
        

        【讨论】:

          猜你喜欢
          • 2021-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-05
          • 2018-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多