【问题标题】:count the number of images on a webpage, using urllib使用 urllib 计算网页上的图像数量
【发布时间】:2013-08-20 14:49:52
【问题描述】:

对于一个课程,我有一个练习,我需要计算任何给定网页上的图像数量。我知道每张图片都以 开头,所以我使用正则表达式来尝试定位它们。但是我一直在数一个我知道是错误的,我的代码有什么问题:

import urllib
import urllib.request
import re
img_pat = re.compile('<img.*>',re.I)

def get_img_cnt(url):
  try:
      w =  urllib.request.urlopen(url)
  except IOError:
      sys.stderr.write("Couldn't connect to %s " % url)
      sys.exit(1)
  contents =  str(w.read())
  img_num = len(img_pat.findall(contents))
  return (img_num)

print (get_img_cnt('http://www.americascup.com/en/schedules/races'))

【问题讨论】:

    标签: python html regex html-parsing urllib


    【解决方案1】:

    你的正则表达式是贪婪的,所以它匹配的比你想要的多。我建议使用 HTML 解析器。

    img_pat = re.compile('&lt;img.*?&gt;',re.I) 如果您必须以正则表达式的方式进行操作,则可以解决问题。 ? 使它不贪婪。

    【讨论】:

      【解决方案2】:

      永远不要使用正则表达式来解析 HTML,使用 html 解析器,例如 lxmlBeautifulSoup。这是一个工作示例,如何使用BeautifulSouprequests 获取img 标签计数:

      from bs4 import BeautifulSoup
      import requests
      
      
      def get_img_cnt(url):
          response = requests.get(url)
          soup = BeautifulSoup(response.content)
      
          return len(soup.find_all('img'))
      
      
      print(get_img_cnt('http://www.americascup.com/en/schedules/races'))
      

      这是一个使用 lxmlrequests 的工作示例:

      from lxml import etree
      import requests
      
      
      def get_img_cnt(url):
          response = requests.get(url)
          parser = etree.HTMLParser()
          root = etree.fromstring(response.content, parser=parser)
      
          return int(root.xpath('count(//img)'))
      
      
      print(get_img_cnt('http://www.americascup.com/en/schedules/races'))
      

      两个 sn-ps 都打印106

      另见:

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        啊啊正则表达式。

        您的正则表达式模式&lt;img.*&gt; 说“给我找一些以&lt;img 开头的东西,并确保它以&gt; 结尾。

        不过,正则表达式是贪婪的;它会用它所能做的一切来填充.*,同时在某处留下一个&gt; 字符以满足模式。在这种情况下,它会一直走到最后,&lt;html&gt; 并说“看!我在那儿找到了一个&gt;!”

        您应该通过使.* 不贪婪来得出正确的计数,如下所示:

        &lt;img.*?&gt;

        【讨论】:

        • 谢谢,确实有效。我不明白是什么?在做什么?
        • 它告诉正则表达式在第一次遇到&gt; 时停止搜索,而不是最近一次。所以它会捕获每个&lt;img /&gt; 而不仅仅是一个大的&lt;img /&gt;(其中可能包含其他
        • ? 告诉正则表达式匹配任意的.* 模式尽可能个字符,而不是(这是默认值)。因此,如果我们将正则表达式拟人化一点时间,它会看到&lt;img,然后尽快寻找&gt; 来结束匹配。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 2015-06-28
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多