私はり 发表于 2020-12-22 13:32:43

爬取一个页面的信息

我想要爬取这个页面的信息https://www.shanghairanking.cn/rankings/bcur/202011
我自己写了点 ,但不太懂
import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
x = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/a/text()')#//获取文档中所有匹配的节点
d = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/text()')
print(x)
print(d)
怎么让他排版和网页一样 怎么会有很多的逗号 /n 之类的东西
求求解答 感激!

逃兵 发表于 2020-12-22 15:58:56

import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
x = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/a/text()')#//获取文档中所有匹配的节点
d = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/text()')
for i in range(len(x)):
        print(x,d)

私はり 发表于 2020-12-22 18:30:23

逃兵 发表于 2020-12-22 15:58


加的代码什么意思,len(x), 10:13

私はり 发表于 2020-12-22 18:31:54

逃兵 发表于 2020-12-22 15:58


爬取这个网页的完整代码能写下么

太阳总会升起 发表于 2020-12-22 20:56:04

import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}

# 获取网页源代码
res = requests.get(url=url, headers=headers)
res.encoding = 'utf-8'
html = etree.HTML(res.text)#利用etree.HTML,将字符串解析为HTML文档

# 建立字典,存放排名与学校名
# university = {}

# 用xpath解析html文档,//表示当前节点的子节点或孙子节点,/表示当前节点的直接子节点,@表示属性,text()表示html文档标签的内容
# 取出排名
num_data_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/text()')
len_num_data = len(num_data_list)
# 取出学校名
name_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/a/text()')
# 用索引值遍历排名
for i in range(len_num_data):
        # 处理排名格式,先用换行符切片,排名在切片后的第二个元素,再用lstrip()去除数字前面的空格
        num = num_data_list.split('\n').lstrip()
        # 因为排名和学校名一一对应,所以可以用索引值来对应他们
        name = name_list
        print(num, name)

#         university = name
# print(university)

当前代码是直接打印
把16,32,33取消注释,再把30行注释,就可以把排名及学校名存入字典

逃兵 发表于 2020-12-23 08:20:57

私はり 发表于 2020-12-22 18:31
爬取这个网页的完整代码能写下么

你写的代码里,html就是整个网页了

x和d都是从html中,根据xpath相同所截取的不同列表

len(x)代表的列表中有多少个元素

d标识d列表第i个元素中的第10~13个字符串

比如
d = '\n          北京\n          '
d = ' 北京'
d = '北京'

私はり 发表于 2020-12-23 14:21:16

逃兵 发表于 2020-12-23 08:20
你写的代码里,html就是整个网页了

x和d都是从html中,根据xpath相同所截取的不同列表


好的

私はり 发表于 2020-12-23 14:27:47

太阳总会升起 发表于 2020-12-22 20:56
当前代码是直接打印
把16,32,33取消注释,再把30行注释,就可以把排名及学校名存入字典

我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来

逃兵 发表于 2020-12-23 15:28:18

私はり 发表于 2020-12-23 14:27
我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来

import requests
from lxml import etree
import openpyxl

url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = 'utf-8'
html = etree.HTML(r.text)#利用etree.HTML,将字符串解析为HTML文档
x = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/a/text()')#//获取文档中所有匹配的节点
d = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/text()')
l = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/text()')
z = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/text()')
c = html.xpath('//*[@id="content-box"]/div/table/tbody/tr/td/text()')
wb = openpyxl.Workbook()
ws = wb.active
title = ['排名','学校','总分','类型','省','层次']
print(title)
ws.append(title)
for i in range(len(x)):
    lst=.strip(),z.strip(),l.strip(),d.strip(),c.strip()]
    print(lst)
    ws.append(lst)
      
wb.save('大学排名.xlsx')

私はり 发表于 2020-12-23 15:37:16

逃兵 发表于 2020-12-23 15:28


感谢

太阳总会升起 发表于 2020-12-23 15:56:56

私はり 发表于 2020-12-23 14:27
我想爬取排名 学校 总分 类型 省市 层次 全爬下来
能不能写一下
我尝试了下 写不出来

还是和取出排名的一样,处理方法也一样,你可以把相同的写一个函数来调用
import requests
from lxml import etree


url = 'https://www.shanghairanking.cn/rankings/bcur/202011'
headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}

# 获取网页源代码
res = requests.get(url=url, headers=headers)
res.encoding = 'utf-8'
html = etree.HTML(res.text)#利用etree.HTML,将字符串解析为HTML文档

# 用xpath解析html文档,//表示当前节点的子节点或孙子节点,/表示当前节点的直接子节点,@表示属性,text()表示html文档标签的内容
# 取出排名
num_data_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/text()')
len_num_data = len(num_data_list)
# 取出学校名
name_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/a/text()')
# 取出省市
city_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/text()')
# 取出类型
type_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/text()')
# 取出总分
score_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/text()')
# 取出层次
level_list = html.xpath('//div[@class="rk-table-box"]//tbody/tr/td/text()')
# 用索引值遍历排名
for i in range(len_num_data):
      # 处理排名格式,先用换行符切片,排名在切片后的第二个元素,再用lstrip()去除数字前面的空格
      num = num_data_list.split('\n').lstrip()
      # 因为排名和学校名一一对应,所以可以用索引值来对应他们
      name = name_list
      city = city_list.split('\n').lstrip()
      type_ = type_list.split('\n').lstrip()
      score = score_list.split('\n').lstrip()
      level = level_list.split('\n').lstrip()

      print(num, name, city, type_, score, level)

私はり 发表于 2020-12-23 16:05:07

太阳总会升起 发表于 2020-12-23 15:56
还是和取出排名的一样,处理方法也一样,你可以把相同的写一个函数来调用

非常感谢 ,我之前用你那个代码改写的和你差不多,但是没有那个换行导致很多空格和逗号之类的东西,运行就会卡死 再次感谢哈{:5_109:}

太阳总会升起 发表于 2020-12-23 16:09:27

私はり 发表于 2020-12-23 16:05
非常感谢 ,我之前用你那个代码改写的和你差不多,但是没有那个换行导致很多空格和逗号之类的东西,运行 ...

没事{:5_91:}
页: [1]
查看完整版本: 爬取一个页面的信息