在爬取网址时,如何用python的正则匹配?

如下一段html代码,有两段//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg,现只想获得前面一个。
<img class="course-banner lazy" data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" src="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" style="display: inline;">

阅读 4.7k
5 个回答

我觉着正确的方法是使用re.findall, 虽然你的例子是给了一段img, 但是实际应用更多的是查询一个html页面, 里面有若干img需要检索.

html_string='<img class="course-banner lazy" data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" src="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" style="display: inline;"><img class="course-banner lazy" data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" src="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" style="display: inline;"><img class="course-banner lazy" data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" src="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" style="display: inline;">'

import re
pick=re.findall(r'<img.+?data-original="(.+?)"', html_string)
print pick

这样得到一个名为pick的list, 里面是所有匹配到的数据.

以下代码:

    import re

    a="""
    <img class="course-banner lazy" data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" src="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" style="display: inline;">
    """


    p = re.compile('data-original="(\S+)"')
    
    iterator = p.finditer(a)
    for match in iterator:
        print match.span()
        print match.group()
        print match.group(1)

将会输出:

(33, 103)
data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg"
//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg
<img class="course-banner lazy" data-original="(.*?)" 

正则这么写就行了。

import re

test = '<img class="course-banner lazy" data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" src="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" style="display: inline;">'

content = re.search('<img class="course-banner lazy" data-original="(.*?)"',test)

print(content.group(1))
//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg #这是输出结果

import re
html = """<img class="course-banner lazy" data-original="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" src="//img4.hhhaaa.com/5a405d45000175cb06000338-240-135.jpg" style="display: inline;">"""
p = re.compile('data-original="(.*?)"')
print(p.search(html).group(1))

一楼的finditer方法是一个非常好的方法,它会返回一个迭代器,而不是返回所有的匹配数据,这样的好处一个是节省内存,另一个是能逐个输出,楼主可以参考,谢谢

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题