python 抓取天气时碰到的一点正则问题 (.*)和(.*?)

本文介绍了一种利用Python爬虫技术抓取指定城市天气预报的方法,并详细解析了正则表达式的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#coding=utf-8
import urllib2
import urllib
import re

city_number=101191101
url='http://www.weather.com.cn/weather/'+str(city_number)+'.shtml'
req=urllib2.Request(url)
response=urllib2.urlopen(req)
myPage=response.read()

pattern=re.compile("<li class='dn' data-dn='7d2'>([\s\S]*?)</li>")
myMatch=pattern.search(myPage,re.S)
sa=myMatch.group(1)
BgnPartRex = re.compile("\"")
sa=BgnPartRex.sub("",sa)
#print sa
temperature=re.compile('<span>(.*?)</span><i>')
temp=temperature.findall(sa,re.S)
print temp

第18行正则中用(.*?)和(.*)的结果一样,先看页面源码:

<h1>明天</h1>
<h2>2日</h2>
<big class=jpg50 d00></big>
<big class=jpg50 n00></big>
<p class=wea>晴</p>
<p class=tem tem1>
<span>37</span><i>°C</i>
</p>
<p class=tem tem2>
<span>28</span><i>°C</i>
</p>
<p class=win>
<em>
<span title=南风 class=S></span>
<span title=南风 class=S></span>
</em>
<i>3-4级转4-5级</i>
</p>
<div class=slid></div>

其中代表温度的两行形式一样,因此使用 (.*?) 匹配到第一行,再通过findall方法把第二行也匹配了出来,而使用(.*)不能匹配换行,所以同样只能匹配到第一行,因而效果与(.*?)相同。千万要记住(.*)不能匹配换行,如果想要匹配换行,应使用([\s\S]*)。
### Python 爬虫与正则表达式使用教程 #### 安装必要的库 为了构建基于Python的爬虫并利用正则表达式来解析HTML文档或者纯文本文件,需要安装一些第三方库。通常情况下会涉及到`requests`用于发起HTTP请求获取页面源码;而`BeautifulSoup`(来自`bs4`包)可以用来做初步的数据清理工作,使得后续通过正则表达式进一步筛选变得容易很多[^1]。 ```bash pip install requests beautifulsoup4 ``` #### 正则表达式的引入 当目标是从非结构化的网页内容里抽取特定模式的信息正则表达式就显得尤为重要了。它允许定义复杂的匹配规则去定位那些难以直接抓取的内容片段。在Python中操作正则表达式主要依赖于内置的标准库——`re`模块[^3]。 导入该模块之后就可以调用其提供的多种方法来进行字符串模式匹配: - `search()` 方法扫描整个字符串并返回第一个成功的匹配; - `findall()` 返回所有不重叠的发生位置列表; - `sub()` 可以实现替换功能,在数据清洗阶段非常有用; - `split()` 能够按照指定分隔符分割输入串成数组形式[^2]。 这里给出一个简单的例子展示如何运用这些工具组合起来完成一项具体的任务—从一段文字里面找出所有的电子邮件地址: ```python import re text = "Contact us at support@example.com or sales@company.org" email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z]{2,}\b' emails_found = re.findall(email_pattern, text) print(emails_found) # 输出: ['support@example.com', 'sales@company.org'] ``` 上述代码首先指定了一个符合E-mail格式特征的正则表达式模板,接着借助`findall()`函数一次性找到了所有符合条件的结果[^4]。 #### 实战演练:贴吧帖子信息采集 假设现在有一个需求是要收集百度贴吧某主题下的热门贴子链接及其标题。此除了要掌握好基本语法外还需要考虑实际场景下可能出现的各种情况比如标签嵌套层次深浅不定等问题。因此建议先采用`BeautifulSoup`简化DOM树再配合上精心设计过的正则表达式来做最后一步精准过滤。 ```python from bs4 import BeautifulSoup as soup import re html_doc = "<div class='threadlist_title pull_left j_th_tit'><a href='/p/789'>测试发帖</a></div>" parsed_html = soup(html_doc,'lxml') link_and_titles = parsed_html.find_all('a',href=re.compile(r'/p/\d+')) for item in link_and_titles: print(item.get_text(),item['href']) ``` 这段脚本先是加载了一个模拟出来的HTML片断作为演示对象,随后创建了解析器实例并通过链式调用的方式快速锁定了含有超链接属性且路径样式为`/p/<number>`的目标节点集合,最终遍历输出每篇文章的名字连同对应的相对URL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值