入门级别python问题

import requests
from lxml import etree
import time
#为什么下面只能得到一个[]
for i in range(5,0,-1):#循环一次就是每一页的公告的标题。时间。点击量
    if (i == 0):#第一页和其他页的url规律不同所以条件语句
        url = 'http://hhxy.cqjtu.edu.cn/dwgk_ywgk.htm'
    else:
        url = 'http://hhxy.cqjtu.edu.cn/dwgk_ywgk' + str(i) + '.htm'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
    }
    response = requests.get(url, headers=headers,timeout=(2, 10)).text
    print(response)
    html = etree.HTML(response)
    print(html)
    divs = html.xpath('/html/body/div[2]/table/tbody/tr/td[1]/div/div[4]/div[3]/table/tbody/tr')
    print(divs)



    for div in divs:
        title = div.xpath("./td[2]/a/text()")[0]
        TM = div.xpath("./td[3]/span/text()")[0]
        href = div.xpath("./td[3]/span/a@href")[0]
        href2 = "http://hhxy.cqjtu.edu.cn/" + href
        # 导入这个href2,是为了去获取点击量,但是连之前的[]都没解决,哎。。。
        print(title, TM, href2)
        time.sleep(1)

        with open("河海学院.txt", "a", encoding="utf-8") as f:
            f.write("{},{},{}.format(title,TM,href2)")
            f.write("\n")


1首先你的代码压根就没返回相应内容 头信息不全无法获取
2.其次你的定位不到是最后的这个tbody(也就是最后的那个table后面那个)浏览器会对html文本进行一定的规范化,所以会自动在路径中加入tbody,导致读取失败,在此处直接在路径中去除tbody即可 所以你手动加了就找不到了
最终你因为上面两个原因返回是空列表【】
所以修改后的基础代码如下 仅仅获取第一页的


import requests
from lxml import html

url = 'http://hhxy.cqjtu.edu.cn/dwgk_ywgk.htm'

HEADER = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
        # "Cookie": "JSESSIONID=BC06B8370F297B9ADFE2C82EF2F6E331",

        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
    }
webpage = requests.get(url, headers=HEADER)
tree = html.fromstring(webpage.content)

text = tree.xpath('//*/div[@class="twidth"]/table/tbody/tr/td[1]/div/div[4]/div[@class="mm"]/table/tr/td/a/text()')
for t in text:
    print(t)

img

定位半天不容易 给个采纳 哈哈

img

望采纳!!点击该回答右侧的“采纳”按钮即可采纳!!
我看到你的有些错误在写入文件时,您使用了{}.format(title,TM,href2)来格式化字符串,但是没有使用括号将其括起来,导致程序报错。

正确的写法应该是:

f.write("{},{},{}".format(title,TM,href2))


或者使用f-strings(Python 3.6及以上版本支持):

f.write(f"{title},{TM},{href2}")

另外,建议在写入文件时换行,这样可以让文件更加美观易读。例如:

f.write("{},{},{}".format(title,TM,href2))
f.write("\n")

别用text 啦~直接json()不香吗。取值方便、准确

这样写同样的名字,结果会覆盖了把

应该是写入文件报错了,加上except处理就看出来了

你这个保存可能有点问题,一般来说在xpath定位之后我会这么保存数据。

使用 Python 中的字典(dict)来保存爬取的数据,然后使用 Python 的内置函数 open() 和 write() 将字典数据保存到文件中。

下面是一个示例代码,该代码使用 xpath 爬取网页中的数据,并将爬取的数据保存到字典中,然后将字典数据保存到文件中

import requests
from lxml import html

# 发送 HTTP GET 请求,获取网页内容
response = requests.get('https://www.example.com')

# 使用 lxml 库解析网页内容
doc = html.fromstring(response.text)

# 使用 xpath 定位数据
data = doc.xpath('//div[@class="data"]')

# 创建一个空字典,用于保存爬取的数据
data_dict = {}

# 遍历每一个数据项,将数据添加到字典中
for item in data:
    key = item.xpath('./div[@class="key"]/text()')[0]
    value = item.xpath('./div[@class="value"]/text()')[0]
    data_dict[key] = value

# 将字典数据保存到文件中
with open('data.txt', 'w') as f:
    f.write(str(data_dict))


在上面的代码中,我们使用了 xpath 定位网页中的数据,并将爬取的数据添加到字典中。然后使用 open() 函数打开一个文件,使用 write() 函数将字典数据写入文件中。

需要注意的是,在 Python 中,字典是无序的,因此在保存到文件中的在 Python 中,字典是无序的。因此,当将字典数据保存到文件中时,可能会出现字典的键值对的顺序不同的情况。