使用 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('<img.*?>',re.I)
如果您必须以正则表达式的方式进行操作,则可以解决问题。 ?
使它不贪婪。
【讨论】:
【参考方案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'))
这是一个使用 lxml
和 requests
的工作示例:
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】:啊啊正则表达式。
您的正则表达式模式<img.*>
说“给我找一些以<img
开头的东西,并确保它以>
结尾。
不过,正则表达式是贪婪的;它会用它所能做的一切来填充.*
,同时在某处留下一个>
字符以满足模式。在这种情况下,它会一直走到最后,<html>
并说“看!我在那儿找到了一个>
!”
您应该通过使.*
不贪婪来得出正确的计数,如下所示:
<img.*?>
【讨论】:
谢谢,确实有效。我不明白是什么?在做什么? 它告诉正则表达式在第一次遇到>
时停止搜索,而不是最近一次。所以它会捕获每个<img />
而不仅仅是一个大的<img />
(其中可能包含其他
?
告诉正则表达式匹配任意的.*
模式尽可能少个字符,而不是多(这是默认值)。因此,如果我们将正则表达式拟人化一点时间,它会看到<img
,然后尽快寻找>
来结束匹配。以上是关于使用 urllib 计算网页上的图像数量的主要内容,如果未能解决你的问题,请参考以下文章
python实现网页登陆验证(自动登录),试了很多百度上的代码(虽然才几行),就是登录不成功,问题在哪?