python 正则,,大佬们教教我

用的这段代码找的名字
findtitle = re.compile(r'<span class="title">(.*)</span>',)

网站源码是这样的:
<div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>



运行得到的结果是这样的:'肖'


只有这一个字,而不是整个的“肖申克的救赎”

 

title = re.findall(findtitle, item)  # 名称

哥们   你这不是没取全啊    你这是存放时把名字也拆开了吧?   电影名字就存了第一个字   打出来也就一个字儿了   这行吧[0]去了就行

这里处理有问题

findtitle = re.compile(r'<span class="title">(.*?)</span>')

加个问号

import urllib.request
from bs4 import BeautifulSoup
import re
 
# 链接
findlink = re.compile(r'<a href="(.*?)">')
# 图片
findimg = re.compile(r'<img.*src="(.*?)"', re.S)  # re.s 表示让换行符包含在内
# 影片的名字
findtitle = re.compile(r'<span class="title">(.*?)</span>',)
# 豆瓣评分
findmarks = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 评价人数
findsb = re.compile(r'<span>(\d*)人评价</span>')
# 找到概况
findinq = re.compile(r'<span class="inq">(.*)</span>')
# 找到影片的相关内容
findrelate = re.compile(r'<p class="">(.*?)</p>', re.S)
baseurl = "https://movie.douban.com/top250?start="
# 爬取网页
def GetData(baseurl):
    datalist = []
    for i in range(0, 1):
        url = baseurl + str(i * 25)
        html = askUrl(url)
    # 逐一解析
    soup = BeautifulSoup(html, "html.parser")
    for item in soup.find_all('div', class_="item"):
        # print(item)  测试
        data = []  # 保存一个电影数据
        item = str(item)
        link = re.findall(findlink, item)[0]  # 链接
        data.append(link)
 
        img = re.findall(findimg, item)[0]  # 图片
        data.append(img)
 
        title = re.findall(findtitle, item)[0]  # 名称
        print("----------->"+title)
        if len(title) == 2:
            ctitle = title[0]
            data.append(ctitle.strip())
            otitle = title[1].replace("/", "")
            data.append(otitle.strip())
        else:
            data.append(title[0].strip())
            data.append(' ')  # 留空
 
        marks = re.findall(findmarks, item)[0]  # 评分
        data.append(marks)
 
        sb = re.findall(findsb, item)[0]  # 评价人数
        data.append(sb)
 
        inq = re.findall(findinq, item)  # 概况
        if len(inq) != 0:
            inq = inq[0].replace("。", "")  # 去掉句号
            data.append(inq)
        else:
            data.append(" ")  # 留空
 
        relate = re.findall(findrelate, item)[0]  # 找到相关
        relate = re.sub('<br(\s+)?/>(\s+)?', " ", relate)
        data.append(relate.strip())    # 去掉前后空格
        datalist.append(data)   # 处理好的一系列电影信息放入
    print(datalist)
 
# 得到一个指定url的网页内容
def askUrl(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"
    }
    # 用户代理
    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html
 
 
 
 
 
 
 
 
 
 
 
if __name__ == '__main__':
    GetData("https://movie.douban.com/top250?start=")

 

title = re.findall(findtitle, item)[0] # 名称

这么写相当于只取电影名的第一个字儿   re.findall(findtitle, item)取出来    ['肖','申','克','的','救','赎']     [0]索引第一个就是‘肖’咯   

title = re.findall(findtitle, item)      就行了

        

主要是以下代码段的问题

 title = re.findall(findtitle, item) # 名称
        if len(title) == 2:                 # 判断的应该是findtitle的结果,而不应该是第一个值的
            ctitle = title[0]               # 这行才是取中文名,即第一个元素
            data.append(ctitle.strip())
            otitle = title[1].replace("/", "")   # 英文为第二个元素
            data.append(otitle.strip())
        else:                               # len(title)为1时  findtitle只有一个中文名元素
            data.append(title[0].strip())
            data.append(' ')  # 留空

也就是判断条件是针对re.findall(findtitle, item),即 ['肖申克的救赎', '\xa0/\xa0The Shawshank Redemption']这个结果 ,  而不是re.findall(findtitle, item)[0]     data列表中放的应该是re.findall(findtitle, item)[0], 而不是re.findall(findtitle, item)[0][0]

其他如link ,  不需要该判断,直接放的就是re.findall(findlink, item)[0]

import re
s='''<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>
 
 
                            <span class="playable">[可播放]</span>
                    </div>'''
findtitle = re.compile(r'<span class="title">(.*)</span>')
print(re.search(findtitle,s).group(1))
#输出
肖申克的救赎

 

这不就对了吗

import urllib.request
from bs4 import BeautifulSoup
import re
 
# 链接
findlink = re.compile(r'<a href="(.*?)">')
# 图片
findimg = re.compile(r'<img.*src="(.*?)"', re.S)  # re.s 表示让换行符包含在内
# 影片的名字
findtitle = re.compile(r'<span class="title">(.*?)</span>',)
# 豆瓣评分
findmarks = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 评价人数
findsb = re.compile(r'<span>(\d*)人评价</span>')
# 找到概况
findinq = re.compile(r'<span class="inq">(.*)</span>')
# 找到影片的相关内容
findrelate = re.compile(r'<p class="">(.*?)</p>', re.S)
baseurl = "https://movie.douban.com/top250?start="
# 爬取网页
def GetData(baseurl):
    datalist = []
    for i in range(0, 1):
        url = baseurl + str(i * 25)
        html = askUrl(url)
    # 逐一解析
    soup = BeautifulSoup(html, "html.parser")
    for item in soup.find_all('div', class_="item"):
        # print(item)  测试
        data = []  # 保存一个电影数据
        item = str(item)
        link = re.findall(findlink, item)[0]  # 链接
        data.append(link)
 
        img = re.findall(findimg, item)[0]  # 图片
        data.append(img)
 
        title = re.findall(findtitle, item)[0]  # 名称
        print("----------->"+title)
        data.append(title)
       
 
        marks = re.findall(findmarks, item)[0]  # 评分
        data.append(marks)
 
        sb = re.findall(findsb, item)[0]  # 评价人数
        data.append(sb)
 
        inq = re.findall(findinq, item)  # 概况
        if len(inq) != 0:
            inq = inq[0].replace("。", "")  # 去掉句号
            data.append(inq)
        else:
            data.append(" ")  # 留空
 
        relate = re.findall(findrelate, item)[0]  # 找到相关
        relate = re.sub('<br(\s+)?/>(\s+)?', " ", relate)
        data.append(relate.strip())    # 去掉前后空格
        datalist.append(data)   # 处理好的一系列电影信息放入
    print(datalist)
 
# 得到一个指定url的网页内容
def askUrl(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"
    }
    # 用户代理
    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html
 
 
 
 
 
 
 
 
 
 
 
if __name__ == '__main__':
    GetData("https://movie.douban.com/top250?start=")

 

import urllib.request
from bs4 import BeautifulSoup
import re

# 链接
findlink = re.compile(r'<a href="(.*?)">')
# 图片
findimg = re.compile(r'<img.*src="(.*?)"', re.S)  # re.s 表示让换行符包含在内
# 影片的名字
findtitle = re.compile(r'<span class="title">(.*?)</span>',)
# 豆瓣评分
findmarks = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 评价人数
findsb = re.compile(r'<span>(\d*)人评价</span>')
# 找到概况
findinq = re.compile(r'<span class="inq">(.*)</span>')
# 找到影片的相关内容
findrelate = re.compile(r'<p class="">(.*?)</p>', re.S)
baseurl = "https://movie.douban.com/top250?start="
# 爬取网页
def GetData(baseurl):
    datalist = []
    for i in range(0, 1):
        url = baseurl + str(i * 25)
        html = askUrl(url)
    # 逐一解析
    soup = BeautifulSoup(html, "html.parser")
    for item in soup.find_all('div', class_="item"):
        # print(item)  测试
        data = []  # 保存一个电影数据
        item = str(item)
        link = re.findall(findlink, item)[0]  # 链接
        data.append(link)

        img = re.findall(findimg, item)[0]  # 图片
        data.append(img)

        title = re.findall(findtitle, item)[0]  # 名称
        if len(title) == 2:
            ctitle = title[0]
            data.append(ctitle.strip())
            otitle = title[1].replace("/", "")
            data.append(otitle.strip())
        else:
            data.append(title[0].strip())
            data.append(' ')  # 留空

        marks = re.findall(findmarks, item)[0]  # 评分
        data.append(marks)

        sb = re.findall(findsb, item)[0]  # 评价人数
        data.append(sb)

        inq = re.findall(findinq, item)  # 概况
        if len(inq) != 0:
            inq = inq[0].replace("。", "")  # 去掉句号
            data.append(inq)
        else:
            data.append(" ")  # 留空

        relate = re.findall(findrelate, item)[0]  # 找到相关
        relate = re.sub('<br(\s+)?/>(\s+)?', " ", relate)
        data.append(relate.strip())    # 去掉前后空格
        datalist.append(data)   # 处理好的一系列电影信息放入
    print(datalist)

# 得到一个指定url的网页内容
def askUrl(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"
    }
    # 用户代理
    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html











if __name__ == '__main__':
    GetData("https://movie.douban.com/top250?start=")

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y