使用 urllib 计算网页上的图像数量

Posted

技术标签:

【中文标题】使用 urllib 计算网页上的图像数量【英文标题】:count the number of images on a webpage, using 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'))

【问题讨论】:

【参考方案1】:

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

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

一个很好的网站,可以即时检查您的正则表达式匹配的内容:http://www.pyregex.com/ 了解更多关于正则表达式的信息:http://docs.python.org/2/library/re.html

【讨论】:

【参考方案2】:

永远不要使用正则表达式来解析 HTML,使用 html 解析器,例如 lxml 或 BeautifulSoup。这是一个工作示例,如何使用BeautifulSoup 和requests 获取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

另见:

Python Regex - Parsing HTML Python regular expression for HTML parsing (BeautifulSoup)

希望对您有所帮助。

【讨论】:

【参考方案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; 来结束匹配。

以上是关于使用 urllib 计算网页上的图像数量的主要内容,如果未能解决你的问题,请参考以下文章

使用webdriver+urllib爬取网页数据

python实现网页登陆验证(自动登录),试了很多百度上的代码(虽然才几行),就是登录不成功,问题在哪?

Python 使用 urllib2 抓取网页 Http 错误 500

使用 urllib 进行网页抓取

Python之爬取网页时到的问题——urllib2

在一个网页上的多个图像上使用叠加层