Victor0321 发表于 2022-4-28 01:08:59

正则表达式的应用

求大神帮我看看我的正则表达式哪错了。。。还有个问题就是关于图片的地址都在检查里的哪啊。。。有没有快速能找到的方法啊,我好几次看到的都是java 根本找不到jpg格式的。。。

import re
import urllib.request

def open_url(url):
    req = urllib.request.Request(url)
    req.add_header('user-agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36')

    response = urllib.request.urlopen(req)
    html = response.read().decode('GBK')

    return html

def get_img(html):
   
    imagelist = re.findall(p,html)

    for each in imagelist:
      print (each)

if __name__ == '__main__':
    url = 'http://tieba.baidu.com/photo/p?kw=%E5%BC%A0%E9%9D%93%E9%A2%96&ie=utf-8&flux=1&tid=7679993387&pic_id=0a090ef3d7ca7bcbc5ea47fffb096b63f724a851&pn=1&fp=2&see_lz=1#!/pid0a090ef3d7ca7bcbc5ea47fffb096b63f724a851/pn1'
    get_img(open_url(url))

Victor0321 发表于 2022-4-28 01:09:37

我写的是 这样的。。
p = r'<img class="image_original_original".*src="[^"]+\.jpg"'

wiselin 发表于 2022-4-28 11:26:35

是不是字符串前加了个r,所以失去了转义?

isdkz 发表于 2022-4-28 11:41:05

因为这个页面是 js 动态渲染的,在页面源代码中没有 img 标签,主要都是 js 标签

Victor0321 发表于 2022-4-28 13:14:53

isdkz 发表于 2022-4-28 11:41
因为这个页面是 js 动态渲染的,在页面源代码中没有 img 标签,主要都是 js 标签

那应该怎么快速找到啊。。 我发现现在的大部分页面都是这样的只有js 。。。

Victor0321 发表于 2022-4-28 19:15:29

isdkz 发表于 2022-4-28 11:41
因为这个页面是 js 动态渲染的,在页面源代码中没有 img 标签,主要都是 js 标签

我最后导出来的html咋是这样的啊。。。。


import re
import urllib.request
import chardet

def get_encoding(res):
    coding_method = chardet.detect(res)['encoding']
    if coding_method == 'GB2312':
      coding_method = 'GBK'
    return coding_method

def open_url(url):
    req = urllib.request.Request(url)
    req.add_header('user-agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36')

    response = urllib.request.urlopen(req).read()
    cod = get_encoding(response)
    html = response.decode(cod)
    print(html)
    return html

def get_img(html):
    p = r'src="[^"]+\.jpg"'
    imagelist = re.findall(p,html)
    print(imagelist)
    for each in imagelist:
      filename = each.split('/')[-1]
      urllib.request.urlretrieve(each , filename , None)

if __name__ == '__main__':
    url = 'http://tieba.baidu.com/photo/p?kw=%E5%BC%A0%E9%9D%93%E9%A2%96&ie=utf-8&flux=1&tid=7679993387&pic_id=0a090ef3d7ca7bcbc5ea47fffb096b63f724a851&pn=1&fp=2&see_lz=1#!/pid0a090ef3d7ca7bcbc5ea47fffb096b63f724a851/pn1'
    get_img(open_url(url))

Victor0321 发表于 2022-4-28 23:52:46

isdkz 发表于 2022-4-28 11:41
因为这个页面是 js 动态渲染的,在页面源代码中没有 img 标签,主要都是 js 标签

def find_depth(res):
    soup = bs4.BeautifulSoup(res.text, 'html.parser') ##生成一个bs4的对象,或者使用lxml 解析
    depth = soup.find('span', class_='next').previous_sibling.previous_sibling.text ##找到class属性为next的span标签,的前前兄弟节点

这个previous_sibling.previous_sibling.text是啥意思啊。。

isdkz 发表于 2022-4-29 00:13:49

Victor0321 发表于 2022-4-28 23:52
def find_depth(res):
    soup = bs4.BeautifulSoup(res.text, 'html.parser') ##生成一个bs4的对象, ...

就是跟它并列一级的上上个标签的文本

Victor0321 发表于 2022-4-29 02:02:54

isdkz 发表于 2022-4-29 00:13
就是跟它并列一级的上上个标签的文本

这个并列级 好像很难理解的样子。。。我琢磨了半天

isdkz 发表于 2022-4-29 05:54:16

本帖最后由 isdkz 于 2022-4-29 05:55 编辑

Victor0321 发表于 2022-4-29 02:02
这个并列级 好像很难理解的样子。。。我琢磨了半天

有那么难理解吗?同一个目录下的文件就属于并列级,

html 的标签跟目录也差不多,有上一级的,也有同一级的,

学过 html 的话就不难理解

Victor0321 发表于 2022-4-29 11:29:05

isdkz 发表于 2022-4-29 05:54
有那么难理解吗?同一个目录下的文件就属于并列级,

html 的标签跟目录也差不多,有上一级的,也有 ...

emmm 主要确实还是没学过,,我等下去度娘下 。。

洛与春风 发表于 2022-4-30 12:53:04

Victor0321 发表于 2022-4-28 01:09
我写的是 这样的。。
p = r'

你要的是哪部分啊,为啥没()

洛与春风 发表于 2022-4-30 12:54:41

Victor0321 发表于 2022-4-28 01:09
我写的是 这样的。。
p = r'

可以去网页用正则工具自己弄一下
页: [1]
查看完整版本: 正则表达式的应用