鱼C论坛

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

[已解决]parsel解析

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

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

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

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

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

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

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

  22.         print(f'城市: {city}, 最低气温: {min_temperature}')
复制代码
屏幕截图(59).png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

  11. for city, temperature in zip(cities, temperatures):
  12.     print(f"城市:{city},最低温度:{temperature}")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个不行,爬不到
屏幕截图(60).png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,加代码就可以了,如果有帮助能给个最佳答案吗
  1. with open('weather_data.txt', 'w') as file:
  2.     for city, temperature in zip(cities, temperatures):
  3.         file.write(f"城市:{city},最低温度:{temperature}\n")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码没有问题,只是没有保存
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

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

  11. with open('weather_data.txt', 'w') as file:
  12.     for city, temperature in zip(cities, temperatures):
  13.         file.write(f"城市:{city},最低温度:{temperature}\n")


复制代码
屏幕截图(61).png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的代码确实爬不到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

  22.         print(f'城市: {city}, 最低气温: {min_temperature}')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 17:52:49 | 显示全部楼层
首先,请确保您已经安装了 parsel 和 requests 库。如果没有安装,可以使用以下命令安装:
  1. pip install parsel requests
复制代码

然后,您可以使用以下代码来爬取城市和最低温度:
  1. import requests
  2. from parsel import Selector
  3. url = "http://www.weather.com.cn/textFC/hb.shtml"
  4. # 发送请求并获取页面内容
  5. response = requests.get(url)
  6. response.encoding = "utf-8"
  7. html_content = response.text
  8. # 使用Parsel解析页面
  9. selector = Selector(text=html_content)
  10. # 定位城市和最低温度的XPath
  11. cities_xpath = "//div[contains(@class, 'conMidtab')]//td[2]/a/text()"
  12. min_temps_xpath = "//div[contains(@class, 'conMidtab')]//td[8]/text()"
  13. # 提取城市和最低温度
  14. cities = selector.xpath(cities_xpath).getall()
  15. min_temps = selector.xpath(min_temps_xpath).getall()
  16. # 将结果打印出来
  17. for city, min_temp in zip(cities, min_temps):
  18.     print(f"{city}: {min_temp}")
复制代码

这段代码首先发送一个请求到目标网址并获取HTML内容。接着,使用Parsel的 Selector 解析页面,然后根据XPath提取城市和最低温度的数据。最后,将结果打印出来。

请注意,这个代码只适用于该网址的当前结构。如果页面结构发生改变,您可能需要更新XPath以获取正确的数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个爬出来是这样的
屏幕截图(62).png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


为什么你就是不看我的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-8 18:21:39 | 显示全部楼层
请关注下我的答案吧,球球了:https://fishc.com.cn/forum.php?m ... 602&pid=6280035
小甲鱼最新课程 -> https://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 ...

没看到,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

一开始看到了,后来刷新一下没了,就没看到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

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

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

  26.             print(f'城市: {city}, 最低气温: {min_temperature}')
  27.     print('\n', '-' * 50, '\n', sep='')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

请问这个代码为什么可以爬取到每一天的呢,我没太没看懂,网页中需要点击才会显示,代码也没有发现点击的动作为什么就可以爬取到呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

你点击的时候实际上就是执行了js代码把之前显示的设为隐藏,把你点击的那个的隐藏属性去掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-27 15:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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