【问题标题】:finding images in html source code with python使用python在html源代码中查找图像
【发布时间】:2013-10-28 22:13:13
【问题描述】:

我必须在 html 源代码中找到图像。我使用 regex 而不是 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 上运行它时,出现语法错误并一直突出显示插入符号。为什么?

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

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

我绝对是新手,编程很糟糕,没有办法。我一直在阅读所有 cmets,我非常感谢用户向我展示的所有帮助和耐心。

【问题讨论】:

  • 您遇到语法错误,因为...这是无效的语法(提示:re.compile 需要一个字符串)。但是您应该只看一下 BeautifulSoup html 解析器,这里和其他地方都有足够的示例可以帮助您入门。
  • @user2799617 这个人提出了一个有效的问题,向我们展示了他的尝试,并在 regex101(我们需要一个链接)上进行了检查。我非常怀疑他做错了任何事情
  • @pythonintraining 对于 gz 问题,我猜您使用的是 Windows。安装 7Zip 之类的实用程序。
  • @user2799617 Not always.
  • 嘿 user2799617,你不需要骑我,我已经骑得够狠了。我认为 stackoverflow 的目的是帮助像我这样的人,如果你想继续咆哮,去 reddit 或 craigslist。

标签: python html regex python-3.x


【解决方案1】:

正则表达式没有任何问题,您缺少两件事:

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

第二个是 Python3 特有的(我看到你正在使用 Py3)

综上所述,只需像这样修复上述行:

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

r 代表原始,b 代表字节序列。

此外,在一个实际将图像嵌入&lt;img&gt; 标签的网站上进行测试,例如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']

【讨论】:

  • 谢谢!我知道我很接近了!
【解决方案2】:

我没有使用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']

【讨论】:

  • 我将添加一个建议。这个答案很好。如果没有任何代码来检索网页,该问题将是有效的。将来,创建一个从字符串或字节数组中查找所需内容的函数可能是值得的。然后该函数只有一个关注点,即查找图像列表。
【解决方案3】:

re.compile (r'&lt;img [^&gt;]*src="([^"]+)')

您在模式周围缺少引号(单引号或双引号)

【讨论】:

  • "并且只是为了确保在表达式中转义引号是好的" - 什么?在这种情况下,这不仅仅是错误的......
  • 同意,但感谢您找到丢失的引号。现在我的错误显示为:TypeError: can't use a string pattern on a bytes-like object
  • 这是关于正则表达式的一般性评论。在他解析 html 的情况下,他应该同时捕获单引号和双引号,但这是他的工作
  • @mislav 你知道字符串前面的r 是什么意思吗?只有在确实需要转义引号时才应“转义”引号。您的正则表达式匹配 \" 而不仅仅是 "
  • 我正在改变答案,只是不要在未来让某人脱轨,只包括关于缺少引号的评论。担心 html 正则表达式中的引号是一个全新的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 2022-01-26
相关资源
最近更新 更多