我有一个python脚本,可以下载html和html中显示的图像,这样我就可以在本地打开文件了。
它工作正常,唯一的问题是,有一个div,其中图像不会被正则表达式下载/找到。我不知道为什么。这不是一个大问题,但我想知道原因。
这是剧本的重要部分:
url = "http://www.somedomain.com"
urlContent = urllib2.urlopen(url).read()
#Write originalHtml to file
f = open("originalHtml",'w')
f.write(urlContent)
f.close()
# HTML image tag: some_text
imgUrls = re.findall('img .*?src="(.*?)"', urlContent)
之后,我逐个循环链接,下载图像并替换html中的链接,以便" src"指向我下载它的本地路径。该脚本负责相关链接和直接链接。
但是,部分图像永远不会被下载。 这是一个没有被拿起的HTML:
<img src="/images/news/den-mcx80001.jpg" style="width:60px;height:36px;margin-top:12px; margin-bottom:12px; margin-left:17px; margin-right:17px;float:left; ">
然而这确实被拿起了:
<img class="productimg" style="width:72px;height:74px;margin-top:15px; margin-bottom:15px; margin-left:3px; margin-right:28px " src="/images/01_prdarticledocs/ImagesSmall/jpr/jpr-prx718xlf.jpg" alt="jpr-prx718xlf">
我不是正则表达式的专家,远非如此,但它似乎应该同时接受,不是吗?
答案 0 :(得分:0)
修正了BeautifulSoup,如评论所示。 任何寻找脚本以使用图像下载HTML的人员的代码片段,保存它们并将html中的图像重新链接到本地相关链接。
import urllib2
import re
from BeautifulSoup import BeautifulSoup
from os.path import basename
from urlparse import urlsplit
#get content of a url and save (not necessary) the originalhtml
url = "http://www.someDomain.com"
urlContent = urllib2.urlopen(url).read()
page = BeautifulSoup(urlContent)
f = open("originalHtml",'w')
f.write(urlContent)
f.close()
#Find all images in the file, put them in imgUrls
imgUrls = page.findAll('img')
imagesDict = {}
# download all images
for image in imgUrls:
try:
#get src tag and download file, save link and local link in dict
imgUrl = image['src']
imgData = urllib2.urlopen(imgUrl).read()
fileName = basename(urlsplit(imgUrl)[2])
location = "images/" + fileName;
imagesDict[location] = imgUrl
print "loc=" + location
output = open(location,'wb')
output.write(imgData)
output.close()
except:
#not so clean solution to catch hard-linked images ('http://somedomain.com/img/image.jpg
try:
imgData = urllib2.urlopen(url + imgUrl).read()
fileName = basename(urlsplit(imgUrl)[2])
location = "images/" + fileName
imagesDict[location] = imgUrl
print "loc=" + location
output = open(location,'wb')
output.write(imgData)
output.close()
except:
print "Double ERROR"
print "Error" + imgUrl
pass
#Replace the old links to new local links
for dictKey in imagesDict:
urlContent = re.sub(imagesDict[dictKey], dictKey, urlContent)
#save HTML
f = open("imagesReplaced.html", 'w')
f.write(urlContent)
f.close()
答案 1 :(得分:0)
您不应该使用正则表达式来解析HTML。
调试这些失败真的很难。我无法看到您发布的图片代码与正则表达式不匹配的任何原因。但是这里有一些例子,这个正则表达式模式将失败。
urlContent = """
single quotes <img src='/image/one.jpg' />
unexpected space <img src ="/image/two.jpg" />
not an img tag <script src="/some/javascript.js">
"""
>>> re.findall('img .*?src="(.*?)"', urlContent)
['/some/javascript.js']
使用html / xml解析器作为另一个答案建议是解决问题的唯一有效方法。
PS:这已在评论中链接,但我想每次讨论主题时都必须包含此答案:RegEx match open tags except XHTML self-contained tags