使用python在html源代码中查找图像

时间:2013-10-20 12:21:58

标签: python html regex python-3.x

我必须在html源代码中找到图像。我正在使用正则表达式而不是html.parser,因为我知道它更好,但是如果你能向我解释如何使用html解析就像你将要一个孩子一样,我也很乐意沿着这条路走下去。

不能使用beautifulsoup,希望我能,但我必须学会这么做。

我已经在regex和html(example)上阅读了很多问题和答案,所以我知道对这个主题的感受。

但请听我说!

这是我的编码尝试(Python 3):

import urllib.request
import re

website = urllib.request.urlopen('http://google.com')
html = website.read()
pat = re.compile (r'<img [^>]*src="([^"]+)')
img = pat.findall(html)

我在regex101.com上仔细检查了我的正则表达式,它可以找到img链接,但是当我在IDLE上运行它时,我收到语法错误并继续突出显示插入符号。为什么呢?

我朝着正确的方向前进......是吗?

更新: 嗨,我想的可能是我得到简短的快速回答,但似乎我可能触动了社区的神经。

我在节目制作方面肯定是新的和可怕的,没有办法解决这个问题。我一直在阅读所有评论,我非常感谢用户向我展示的所有帮助和耐心。

3 个答案:

答案 0 :(得分:2)

正则表达式没有任何问题,你错过了两件事:

  1. Python没有正则表达式类型,因此您必须将其包装在字符串中。使用raw字符串,以便将字符串原样传递给正则表达式编译器,而不进行任何转义解释
  2. .read()调用的结果是字节序列,而不是字符串。所以你需要一个字节序列正则表达式。
  3. 第二个是Python3特定的(我发现你使用的是Py3)

    总而言之,只需按照以下方式修复上述行:

    pat = re.compile (rb'<img [^>]*src="([^"]+)')
    

    r代表raw,b代表字节序列。

    此外,在实际将图片嵌入<img>标记的网站上进行测试,例如http://stackoverflow.com。处理http://google.com

    时,您将找不到任何内容

    我们走了:

    Python 3.3.2+
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import urllib.request
    >>> import re
    >>> website = urllib.request.urlopen('http://stackoverflow.com/')
    >>> html = website.read()
    >>> pat = re.compile (rb'<img [^>]*src="([^"]+)')
    >>> img = pat.findall(html)
    >>> img
    [b'http://i.stack.imgur.com/tKsDb.png', b'http://i.stack.imgur.com/dmHl0.png', b'http://i.stack.imgur.com/dmHl0.png', b'http://i.stack.imgur.com/tKsDb.png', b'http://i.stack.imgur.com/6QN0y.png', b'http://i.stack.imgur.com/tKsDb.png', b'http://i.stack.imgur.com/L8rHf.png', b'http://i.stack.imgur.com/tKsDb.png', b'http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif']
    

答案 1 :(得分:1)

我使用urllib而不是requests,您可以从here下载。他们做同样的事情,我更喜欢requests,因为它有更好的API。正则表达式字符串只是略有改变。如果在\s标记之前有几个空格,则会添加img。你 朝着正确的方向前进。您可以找到有关re模块here的更多信息。

这是代码

import requests
import re

website = requests.get('http://stackoverflow.com//')
html = website.text
pat = re.compile(r'<\s*img [^>]*src="([^"]+)')
img = pat.findall(html)

print img

输出:

[u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/L8rHf.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/Ryr18.png', u'http://i.stack.imgur.com/ASf0H.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/Ryr18.png', u'http://i.stack.imgur.com/VgvXl.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/tKsDb.png', u'http://i.stack.imgur.com/6QN0y.png', u'http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif']

答案 2 :(得分:0)

re.compile (r'<img [^>]*src="([^"]+)')

你错过了模式

周围的引号(单引号或双引号)