Regex不会返回所有img标签 - Python

时间:2016-02-02 13:59:41

标签: python regex html-parsing

我有一个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">

我不是正则表达式的专家,远非如此,但它似乎应该同时接受,不是吗?

2 个答案:

答案 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