源码中有中文,进行正则提取时中文定位信息变成??怎么回事obj3=re.compile(r'<p>.*??????(?P<movie_name>.*?)</p>.*?<a href="(?P<download>.*?)"',re.S)
时间: 2025-01-23 15:51:12 浏览: 36
在Python中使用正则表达式(re模块的`compile()`函数)处理包含中文的源码时,可能会遇到编码问题。当你试图匹配中文字符时,如果没有正确指定编码,`?` 和 `*` 可能会被解释为非贪婪模式或者其他特殊字符,导致中文部分被错误地匹配或丢失。
在这个例子中,`.*??????` 部分可能无法正确识别汉字的编码,使得`movie_name` 和 `download` 正则表达式组出现问题,结果可能是它们捕获的内容缺失或乱码,显示为 `??`。要解决这个问题,你需要确保正则表达式的编译指定了正确的文本编码,通常对于UTF-8编码的文本,可以添加 `re.UNICODE` 标志:
```python
obj3 = re.compile(r'<p>.*\b[\u4e00-\u9fa5]*?(?P<movie_name>.*?)</p>.*?<a href="(?P<download>.*?)"', re.S | re.UNICODE)
```
这里 `\b[\u4e00-\u9fa5]*?` 尝试匹配中文字符,并使用了非贪婪模式。如果源码不是UTF-8,需要替换为相应的字符集范围。
相关问题
''' ''' import re from urllib.request import urlopen def getPage(url): # 获取网页的字符串 response = urlopen(url) return response.read().decode('utf-8') def parsePage(s): ret = com.finditer(s) # 从s这个网页源码中,找到所有符合com正则表达式的内容,并且以迭代器的形式返回 for i in ret: yield{ 'id':i.group('id'), 'title':i.group('title'), 'rating_num':i.group('rating_num'), 'comment_num':i.group('comment_num') } def main(num): # 翻页,执行10次 url = 'https://movie.douban.com/top250?start=%s&filter='% num response_html = getPage(url) # response_html就是这个url对应的html代码,就是 str ret = parsePage(response_html) print(ret) f = open('move_info7','a',encoding='utf8') for obj in ret: print(obj) data = str(obj) f.write(data +'\n') f.close() com = re.compile( '<div class = "item">.*?<div class="pic">.*?<em.*?>(?P<id>\d+).*?<span class = "title">(?P<title>.*?)</span>' '.*?<span class="rating_num".*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',re.S) count = 0 for i in range(10): main(count) count += 25 检查这段代码并且进行修改
这段代码是用来爬取豆瓣电影Top250的信息,并且将结果保存到文件中。但是,代码中存在一些错误和需要改进的地方,建议进行如下修改:
1. 将文件名由'move_info7'改为'movie_info.txt',并且将文件打开操作放在for循环外面,避免重复打开和关闭文件。
2. 将函数名从'getPage'改为'get_page',符合Python的命名规范。
3. 将参数名从's'改为'html',更加直观。
4. 将正则表达式中的空格去掉,避免匹配不到结果。
5. 在文件写入操作之前,需要先检查文件是否存在,如果不存在,则需要创建文件。
修改后的代码如下:
```python
import re
from urllib.request import urlopen
def get_page(url):
# 获取网页的字符串
response = urlopen(url)
return response.read().decode('utf-8')
def parse_page(html):
com = re.compile(
'<div class="item">.*?<div class="pic">.*?<em.*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
'.*?<span class="rating_num".*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
ret = com.finditer(html) # 从html这个网页源码中,找到所有符合com正则表达式的内容,并且以迭代器的形式返回
for i in ret:
yield {
'id': i.group('id'),
'title': i.group('title'),
'rating_num': i.group('rating_num'),
'comment_num': i.group('comment_num')
}
def main(num):
# 翻页,执行10次
url = 'https://movie.douban.com/top250?start=%s&filter=' % num
html = get_page(url) # html就是这个url对应的html代码,就是 str
ret = parse_page(html)
print(ret)
with open('movie_info.txt', 'a', encoding='utf8') as f:
for obj in ret:
print(obj)
data = str(obj)
f.write(data + '\n')
if __name__ == '__main__':
count = 0
for i in range(10):
main(count)
count += 25
```
阅读全文
相关推荐




