鱼C论坛

 找回密码
 立即注册
查看: 2946|回复: 12

[已解决]想通过xpath来爬取一系列的url,不知道哪里出错来,请指教!

[复制链接]
发表于 2020-12-17 04:33:15 | 显示全部楼层 |阅读模式

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

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

x
  1. import requests
  2. from lxml import etree

  3. if __name__=="__main__":
  4.     #Ua伪装
  5.     headers = {
  6.             "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
  7.         }
  8.     #获取页面地址
  9.     list_url = []
  10.     url_1 = "https://sc.chinaz.com/jianli/free.html"
  11.     list_url.append(url_1)
  12.     # for i in range(2,4):
  13.     #     url_n = "https://sc.chinaz.com/jianli/free_{}.html".format(i)
  14.     #     list_url.append(url_n)

  15.     page_text = requests.get(url=url_1,headers=headers).text
  16.     tree = etree.HTML(page_text)%
  17.     jianli_list = []
  18.     jianli_div = tree.xpath("//div[@id='main']/div/a")
  19.     for a in jianli_div:
  20.         jianli_web = a.xpath("./@href/text()")[0]
  21.         print(jianli_web)
复制代码






最后返回的结果是Process finished with exit code 0,我的目的就是想把网页里的url给添加到一个列表里去,怎么也成功不了,愁到凌晨4点了,跪请老鸟教育。。不知道是不是xpath写错了 还是什么情况
最佳答案
2020-12-17 15:45:27
xpath语法错误,多学学基础。
这一段修改一下
  1. page_text = requests.get(url=url, headers=header).text
  2. tree = etree.HTML(page_text)
  3. jianli_list = []
  4. jianli_div = tree.xpath("//div[@id='main']/div/div")
  5. for a in jianli_div:
  6.     jianli_web = 'https:' + a.xpath("a/@href")[0]
  7.     print(jianli_web)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-17 09:02:34 | 显示全部楼层
页面里所有用到的url过滤src和href即可,有的数据如果不想用,你可以遍历整个列进行剔除。

  1. import requests
  2. import re


  3. def main():
  4.     url = 'https://sc.chinaz.com/jianli/free.html'
  5.     headers = {'user-agent': 'firefox'}
  6.     r = requests.get(url, headers=headers)
  7.     result = re.findall(r'(?:href|src)="(.*?)"', r.text)
  8.     print(result)


  9. if __name__ == '__main__':
  10.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 15:45:27 | 显示全部楼层    本楼为最佳答案   
xpath语法错误,多学学基础。
这一段修改一下
  1. page_text = requests.get(url=url, headers=header).text
  2. tree = etree.HTML(page_text)
  3. jianli_list = []
  4. jianli_div = tree.xpath("//div[@id='main']/div/div")
  5. for a in jianli_div:
  6.     jianli_web = 'https:' + a.xpath("a/@href")[0]
  7.     print(jianli_web)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-18 02:45:06 | 显示全部楼层
suchocolate 发表于 2020-12-17 09:02
页面里所有用到的url过滤src和href即可,有的数据如果不想用,你可以遍历整个列进行剔除。

好像您的方式是用正则,我在学习xpath,因为好像其他编程也可以用xpath。非常感谢您的指点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-18 02:46:45 | 显示全部楼层
YunGuo 发表于 2020-12-17 15:45
xpath语法错误,多学学基础。
这一段修改一下

非常感谢您的指点,上个帖子也是您帮忙指点的。因为工作原因和家庭原因,每天只有这个点能有时间学习python,感谢互联网,也感谢有您这样不吝赐教的前辈!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-18 03:28:04 | 显示全部楼层
YunGuo 发表于 2020-12-17 15:45
xpath语法错误,多学学基础。
这一段修改一下

那最后再麻烦您一下,我之前不是想创建一个空的list_url,用来添加首页url_1和后续页url_n,做成一个分页爬取的列表集合,但是发起get请求时,url=list_url,运行后就会报错,但是换成url_1或者url_n就不会报错。请问这个地方该怎么操作呢?不知道我说清楚了没。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-18 10:55:23 | 显示全部楼层
15972156903 发表于 2020-12-18 03:28
那最后再麻烦您一下,我之前不是想创建一个空的list_url,用来添加首页url_1和后续页url_n,做成一个分页 ...

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
  5.     result = []
  6.     url = "https://sc.chinaz.com/jianli/free.html"
  7.     num = int(input('请输入查询的页数:'))
  8.     for i in range(num):
  9.         r = requests.get(url, headers=headers)
  10.         html = etree.HTML(r.text)
  11.         temp = html.xpath('//div[@id="main"]/div/div/a/@href')
  12.         result.extend(temp)
  13.         nx_url = html.xpath('//a[@class="nextpage"]/@href')[0]
  14.         url = 'https://sc.chinaz.com/jianli/' + nx_url
  15.     print(result)


  16. if __name__ == "__main__":
  17.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-18 16:11:01 | 显示全部楼层
15972156903 发表于 2020-12-18 03:28
那最后再麻烦您一下,我之前不是想创建一个空的list_url,用来添加首页url_1和后续页url_n,做成一个分页 ...


程序前面执行了将url添加到列表,你的list_url是一个包含所有url的列表,需要先利用for循环取出,再去请求,不能直接get列表。
  1. #获取页面地址
  2. list_url = []
  3. url_1 = "https://sc.chinaz.com/jianli/free.html"
  4. list_url.append(url_1)
  5. for i in range(2,4):
  6.      url_n = "https://sc.chinaz.com/jianli/free_{}.html".format(i)
  7.      list_url.append(url_n)
  8. # 循环取出url请求
  9. for url in list_url:
  10.     page_text = requests.get(url, headers=headers).text
  11.     tree = etree.HTML(page_text)
  12.     jianli_list = []
  13.     jianli_div = tree.xpath("//div[@id='main']/div/div")
  14.     for a in jianli_div:
  15.         jianli_web = 'https:' + a.xpath("a/@href")[0]
  16.         print(jianli_web)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-19 03:07:06 | 显示全部楼层
YunGuo 发表于 2020-12-18 16:11
程序前面执行了将url添加到列表,你的list_url是一个包含所有url的列表,需要先利用for循环取出,再去 ...

非常感谢,就是差那临门一脚,原来如此。。哈哈。憋了我几天了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-19 03:10:25 | 显示全部楼层

您的代码我跑了一下,好像是可以指定页的爬取。收藏了,多看看前辈代码学习经验
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-19 03:27:55 | 显示全部楼层

请问下前辈,为什么在for循环里 假如爬取的是第二页或后面页,可以执行最后用前缀加nx_url拼好的url来发起get请求呢?而不是用最上面resulr下一行定义好的url呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-19 13:11:49 | 显示全部楼层
15972156903 发表于 2020-12-19 03:27
请问下前辈,为什么在for循环里 假如爬取的是第二页或后面页,可以执行最后用前缀加nx_url拼好的url来发 ...

他那个代码读出来很简单啊,兄弟,python基础建议多学习。python程序是从上往下执行:

result下面那个url是第一页,for循环内那个拼接的url相当于重新赋值了result下面那个url,所以当再次循环的时候url已经不一样了,这样说能明白?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 03:41:05 | 显示全部楼层
YunGuo 发表于 2020-12-19 13:11
他那个代码读出来很简单啊,兄弟,python基础建议多学习。python程序是从上往下执行:

result下面那个 ...

感觉有点是懂非懂。。可能是我代码写少了。。。 最近多看看大佬的代码。。自己去摸索哈。。感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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