鱼C论坛

 找回密码
 立即注册
查看: 1888|回复: 20

[已解决]parsel解析

[复制链接]
发表于 2023-7-8 16:19:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问大佬们,这个页面怎样用parsel把城市和最低温度爬取出来呢 http://www.weather.com.cn/textFC/hb.shtml
最佳答案
2023-7-8 17:17:05
import requests
from parsel import Selector

url = 'http://www.weather.com.cn/textFC/hb.shtml'
response = requests.get(url)
response.encoding='utf-8'
html_content = response.text

# 假设html_content是你从网页获取的HTML内容
selector = Selector(html_content)

# 遍历页面中的每个省/直辖市信息
for province_info in selector.css('body > div.lqcontentBoxH > div.contentboxTab > div > div > div.hanml > div:nth-child(1) > div'):
    # 获取第一个城市名
    city = province_info.css('table > tr:nth-child(3) > td:nth-child(2) > a::text').get()
    # 获取第一个城市的最低温度
    min_temperature = province_info.css('table > tr:nth-child(3) > td:nth-child(8)::text').get()
    print(f'城市: {city}, 最低气温: {min_temperature}')
    # 遍历每个省的每个城市
    for city_info in province_info.css('table > tr')[3:]:
        # 获取城市名
        city = city_info.css('td:nth-child(1) > a::text').get()
        # 获取最低温度
        min_temperature = city_info.css('td:nth-child(7)::text').get()

        print(f'城市: {city}, 最低气温: {min_temperature}')
屏幕截图(59).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-8 16:26:16 | 显示全部楼层
import requests
from parsel import Selector

url = 'http://www.weather.com.cn/textFC/hb.shtml'
response = requests.get(url)
html = response.text

selector = Selector(text=html)
city_elements = selector.css('.conMidtab .conMidtab2 .conMidtab3 a')
temperature_elements = selector.css('.conMidtab .conMidtab2 .conMidtab3 span')

cities = city_elements.css('::text').getall()
temperatures = temperature_elements.css('::text').getall()

for city, temperature in zip(cities, temperatures):
    print(f"城市:{city},最低温度:{temperature}")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-8 16:29:48 | 显示全部楼层

这个不行,爬不到
屏幕截图(60).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 16:56:54 | 显示全部楼层
哈岁NB 发表于 2023-7-8 16:29
这个不行,爬不到

嗯,加代码就可以了,如果有帮助能给个最佳答案吗
with open('weather_data.txt', 'w') as file:
    for city, temperature in zip(cities, temperatures):
        file.write(f"城市:{city},最低温度:{temperature}\n")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 16:57:16 | 显示全部楼层
哈岁NB 发表于 2023-7-8 16:29
这个不行,爬不到

代码没有问题,只是没有保存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-8 17:06:01 | 显示全部楼层
沐雨尘枫 发表于 2023-7-8 16:57
代码没有问题,只是没有保存

大佬,按照你的这个代码我这个咋啥也爬不到
import requests
from parsel import Selector

url = 'http://www.weather.com.cn/textFC/hb.shtml'
response = requests.get(url)
html = response.text

selector = Selector(text=html)
city_elements = selector.css('.conMidtab .conMidtab2 .conMidtab3 a')
temperature_elements = selector.css('.conMidtab .conMidtab2 .conMidtab3 span')

cities = city_elements.css('::text').getall()
temperatures = temperature_elements.css('::text').getall()

with open('weather_data.txt', 'w') as file:
    for city, temperature in zip(cities, temperatures):
        file.write(f"城市:{city},最低温度:{temperature}\n")
屏幕截图(61).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 17:06:35 | 显示全部楼层
沐雨尘枫 发表于 2023-7-8 16:57
代码没有问题,只是没有保存

你的代码确实爬不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 17:17:05 | 显示全部楼层    本楼为最佳答案   
import requests
from parsel import Selector

url = 'http://www.weather.com.cn/textFC/hb.shtml'
response = requests.get(url)
response.encoding='utf-8'
html_content = response.text

# 假设html_content是你从网页获取的HTML内容
selector = Selector(html_content)

# 遍历页面中的每个省/直辖市信息
for province_info in selector.css('body > div.lqcontentBoxH > div.contentboxTab > div > div > div.hanml > div:nth-child(1) > div'):
    # 获取第一个城市名
    city = province_info.css('table > tr:nth-child(3) > td:nth-child(2) > a::text').get()
    # 获取第一个城市的最低温度
    min_temperature = province_info.css('table > tr:nth-child(3) > td:nth-child(8)::text').get()
    print(f'城市: {city}, 最低气温: {min_temperature}')
    # 遍历每个省的每个城市
    for city_info in province_info.css('table > tr')[3:]:
        # 获取城市名
        city = city_info.css('td:nth-child(1) > a::text').get()
        # 获取最低温度
        min_temperature = city_info.css('td:nth-child(7)::text').get()

        print(f'城市: {city}, 最低气温: {min_temperature}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 17:52:49 | 显示全部楼层
首先,请确保您已经安装了 parsel 和 requests 库。如果没有安装,可以使用以下命令安装:
pip install parsel requests
然后,您可以使用以下代码来爬取城市和最低温度:
import requestsfrom parsel import Selectorurl = "http://www.weather.com.cn/textFC/hb.shtml"# 发送请求并获取页面内容response = requests.get(url)response.encoding = "utf-8"html_content = response.text# 使用Parsel解析页面selector = Selector(text=html_content)# 定位城市和最低温度的XPathcities_xpath = "//div[contains(@class, 'conMidtab')]//td[2]/a/text()"min_temps_xpath = "//div[contains(@class, 'conMidtab')]//td[8]/text()"# 提取城市和最低温度cities = selector.xpath(cities_xpath).getall()min_temps = selector.xpath(min_temps_xpath).getall()# 将结果打印出来for city, min_temp in zip(cities, min_temps):    print(f"{city}: {min_temp}")
这段代码首先发送一个请求到目标网址并获取HTML内容。接着,使用Parsel的 Selector 解析页面,然后根据XPath提取城市和最低温度的数据。最后,将结果打印出来。

请注意,这个代码只适用于该网址的当前结构。如果页面结构发生改变,您可能需要更新XPath以获取正确的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-8 18:10:14 | 显示全部楼层
陶远航 发表于 2023-7-8 17:52
首先,请确保您已经安装了 parsel 和 requests 库。如果没有安装,可以使用以下命令安装:

这个爬出来是这样的
屏幕截图(62).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 18:16:10 | 显示全部楼层
哈岁NB 发表于 2023-7-8 18:10
这个爬出来是这样的


为什么你就是不看我的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 18:21:39 | 显示全部楼层
请关注下我的答案吧,球球了:https://fishc.com.cn/forum.php?m ... 602&pid=6280035
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-8 18:25:24 | 显示全部楼层
isdkz 发表于 2023-7-8 18:21
请关注下我的答案吧,球球了:https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=230602&pi ...

没看到,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-8 18:26:13 | 显示全部楼层
isdkz 发表于 2023-7-8 18:16
为什么你就是不看我的?

一开始看到了,后来刷新一下没了,就没看到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 18:26:55 | 显示全部楼层
哈岁NB 发表于 2023-7-8 18:26
一开始看到了,后来刷新一下没了,就没看到了

好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-8 18:47:04 | 显示全部楼层

请问我要是想爬周一周二周三的数据,该怎么爬呢,那个页面必须点一下才会在源网页代码中显示数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 19:14:17 | 显示全部楼层
哈岁NB 发表于 2023-7-8 18:47
请问我要是想爬周一周二周三的数据,该怎么爬呢,那个页面必须点一下才会在源网页代码中显示数据
import requests
from parsel import Selector

url = 'http://www.weather.com.cn/textFC/hb.shtml'
response = requests.get(url)
response.encoding='utf-8'
html_content = response.text

# 假设html_content是你从网页获取的HTML内容
selector = Selector(html_content)
date = selector.css('body > div.lqcontentBoxH > div.contentboxTab > div > div > ul.day_tabs > li::text')

# 遍历页面上每天的信息
for i, day_info in enumerate(selector.css('body > div.lqcontentBoxH > div.contentboxTab > div > div > div.hanml > div')):
    print(f'{date[i].get()}:\n')
    # 遍历页面中的每个省/直辖市信息
    for province_info in day_info.xpath('./div'):
        # 获取第一个城市名
        city = province_info.css('table > tr:nth-child(3) > td:nth-child(2) > a::text').get()
        # 获取第一个城市的最低温度
        min_temperature = province_info.css('table > tr:nth-child(3) > td:nth-child(8)::text').get()
        print(f'城市: {city}, 最低气温: {min_temperature}')
        # 遍历每个省的每个城市
        for city_info in province_info.css('table > tr')[3:]:
            # 获取城市名
            city = city_info.css('td:nth-child(1) > a::text').get()
            # 获取最低温度
            min_temperature = city_info.css('td:nth-child(7)::text').get()

            print(f'城市: {city}, 最低气温: {min_temperature}')
    print('\n', '-' * 50, '\n', sep='')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-8 22:54:30 | 显示全部楼层

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-9 10:20:09 | 显示全部楼层

请问这个代码为什么可以爬取到每一天的呢,我没太没看懂,网页中需要点击才会显示,代码也没有发现点击的动作为什么就可以爬取到呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 10:47:56 | 显示全部楼层
本帖最后由 isdkz 于 2023-7-9 10:55 编辑
哈岁NB 发表于 2023-7-9 10:20
请问这个代码为什么可以爬取到每一天的呢,我没太没看懂,网页中需要点击才会显示,代码也没有 ...


因为他每一天的数据本来就在网页的标签里面的,只不过加了隐藏属性而已,这个不影响我们获取标签,只要选择器写对了就能获取到,隐藏属性只是作用到浏览器解析html标签的

你点击的时候实际上就是执行了js代码把之前显示的设为隐藏,把你点击的那个的隐藏属性去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 13:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表