凯菇发瘟 发表于 2020-8-7 13:41:25

怎么用正则表达式提取演员的名称

<p class="star">
                主演:克里斯蒂安·贝尔,希斯·莱杰,阿伦·伊克哈特
      </p>

qiuyouzhi 发表于 2020-8-7 13:45:25

本帖最后由 qiuyouzhi 于 2020-8-7 13:50 编辑

re.findall('<p class="star">(.*?)</p>', '<p class="star">主演:克里斯蒂安·贝尔,希斯·莱杰,阿伦·伊克哈特</p>')

zltzlt 发表于 2020-8-7 13:49:08

这样行不行:

from re import findall
string = '''<p class="star">
                主演:克里斯蒂安·贝尔,希斯·莱杰,阿伦·伊克哈特
      </p>'''
print(findall(r'<p class="star">.*?主演:(.*?)</p>', string.replace('\n', '')))

陈尚涵 发表于 2020-8-7 13:51:41

zltzlt 发表于 2020-8-7 13:49
这样行不行:

我觉得2楼的行,你这样....

陈尚涵 发表于 2020-8-7 13:52:12

zltzlt 发表于 2020-8-7 13:49
这样行不行:

我强迫症就犯了

凯菇发瘟 发表于 2020-8-7 13:52:15

qiuyouzhi 发表于 2020-8-7 13:45


pat=re.compile(r'<p class="star">[\s\S]*?主演:(.*?)[\s\S]*?</p>')
这样写为什么不行

zltzlt 发表于 2020-8-7 13:52:49

陈尚涵 发表于 2020-8-7 13:51
我觉得2楼的行,你这样....

陈尚涵 发表于 2020-8-7 13:53:14

凯菇发瘟 发表于 2020-8-7 13:52
pat=re.compile(r'[\s\S]*?主演:(.*?)[\s\S]*?')
这样写为什么不行

其实两种都行只不过3楼那种会让我犯强迫症{:10_266:}

凯菇发瘟 发表于 2020-8-7 14:00:17

陈尚涵 发表于 2020-8-7 13:53
其实两种都行只不过3楼那种会让我犯强迫症

不是啊我这么写得到的是一个列表列表里面都是空的

陈尚涵 发表于 2020-8-7 14:01:34

凯菇发瘟 发表于 2020-8-7 14:00
不是啊我这么写得到的是一个列表列表里面都是空的

额,我看看

zltzlt 发表于 2020-8-7 14:05:00

凯菇发瘟 发表于 2020-8-7 14:00
不是啊我这么写得到的是一个列表列表里面都是空的

pat = re.compile(r'<p class="star">.*?主演:(.*?)</p>', re.DOTALL)

凯菇发瘟 发表于 2020-8-7 14:05:13

陈尚涵 发表于 2020-8-7 14:01
额,我看看

我先说说我想干啥:
获取一个电影网的一些电影信息
一会我把代码发过去

凯菇发瘟 发表于 2020-8-7 14:06:37

陈尚涵 发表于 2020-8-7 14:01
额,我看看

import re
import urllib
import urllib.request
import random
url="https://maoyan.com/board/4?"
#用户输入开始和结束的页数
while True:
        print("输入你想爬取电影的开始页数")
        start=int(input())
        if start<=0 or start>34:
                print("输入的开始页数有误请重新输入")
                continue
        else:
                break
while True:
        print("输入你想爬取电影的结束页数")
        end=int(input())
        if end<=0 or end>34:
                print("输入的结束页数有误请重新输入")
                continue
        else:
                break

list1=[]
listrank=[]
listmes=[]
listactor=[]
header1="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
header2="Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
header3="Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0"
header4="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"
list1.append(header1)
list1.append(header2)
list1.append(header3)
list1.append(header4)
for page in range(start,end+1):
        #获取网页
        offset=(page-1)*10
        fullurl=url+"offset="+str(offset)
        choicuesr=random.choice(list1)
        headers={"User-Agent":choicuesr}
        rep=urllib.request.Request(fullurl,headers=headers)
        reponse=urllib.request.urlopen(rep).read().decode()
        #获取排名
        #<i class="board-index board-index-1">1</i>
        #<i class="board-index board-index-2">2</i>
        pat=re.compile(r'<i class="board-index board-index-\d*">(.*?)</i>')
        result=pat.findall(reponse)
        for i in range(0,len(result)):
                listrank.append(result)
        #电影信息
        # title="钢琴家" data-act="boarditem-click"
        # title="勇敢的心" data-act="boarditem-click"
        pat=re.compile(r'alt="(.*?)" class="board-img" />')
        result=pat.findall(reponse)
        for i in range(0,len(result)):
                listmes.append(result)

        #获取演员
        #<p class="star">
        #                主演:梅尔·吉布森,苏菲·玛索,帕特里克·麦高汉
        #      </p>       
        pat=re.compile(r'<p class="star">[\s\S]*?主演:(*?)[\s\S]*?</p>')
        result=pat.findall(reponse)
        for i in range(0,len(result)):
                listactor.append(result)
print(listactor)

凯菇发瘟 发表于 2020-8-7 14:08:13

zltzlt 发表于 2020-8-7 14:05


这里有换行.*我感觉不行吧

凯菇发瘟 发表于 2020-8-7 14:16:16

zltzlt 发表于 2020-8-7 14:05


我懂了re.DOTALL就是让.匹配所有字符,但是我这么写为啥不行

凯菇发瘟 发表于 2020-8-7 14:18:15

zltzlt 发表于 2020-8-7 14:05


我发现了只要(.*?)和*?在一起或者和.*?在一起返回的都是一个列表列表里面所有元素都是空
页: [1]
查看完整版本: 怎么用正则表达式提取演员的名称