鱼C论坛

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

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

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

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

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

x
import requests
from lxml import etree

if __name__=="__main__":
    #Ua伪装
    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"
        }
    #获取页面地址
    list_url = []
    url_1 = "https://sc.chinaz.com/jianli/free.html"
    list_url.append(url_1)
    # for i in range(2,4):
    #     url_n = "https://sc.chinaz.com/jianli/free_{}.html".format(i)
    #     list_url.append(url_n)

    page_text = requests.get(url=url_1,headers=headers).text
    tree = etree.HTML(page_text)%
    jianli_list = []
    jianli_div = tree.xpath("//div[@id='main']/div/a")
    for a in jianli_div:
        jianli_web = a.xpath("./@href/text()")[0]
        print(jianli_web)





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

使用道具 举报

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


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


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 15:45:27 | 显示全部楼层    本楼为最佳答案   
xpath语法错误,多学学基础。
这一段修改一下
page_text = requests.get(url=url, headers=header).text
tree = etree.HTML(page_text)
jianli_list = []
jianli_div = tree.xpath("//div[@id='main']/div/div")
for a in jianli_div:
    jianli_web = 'https:' + a.xpath("a/@href")[0]
    print(jianli_web)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好像您的方式是用正则,我在学习xpath,因为好像其他编程也可以用xpath。非常感谢您的指点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢您的指点,上个帖子也是您帮忙指点的。因为工作原因和家庭原因,每天只有这个点能有时间学习python,感谢互联网,也感谢有您这样不吝赐教的前辈!!!
想知道小甲鱼最近在做啥?请访问 -> 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就不会报错。请问这个地方该怎么操作呢?不知道我说清楚了没。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


def main():
    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"}
    result = []
    url = "https://sc.chinaz.com/jianli/free.html"
    num = int(input('请输入查询的页数:'))
    for i in range(num):
        r = requests.get(url, headers=headers)
        html = etree.HTML(r.text)
        temp = html.xpath('//div[@id="main"]/div/div/a/@href')
        result.extend(temp)
        nx_url = html.xpath('//a[@class="nextpage"]/@href')[0]
        url = 'https://sc.chinaz.com/jianli/' + nx_url
    print(result)


if __name__ == "__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> 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列表。
#获取页面地址
list_url = []
url_1 = "https://sc.chinaz.com/jianli/free.html"
list_url.append(url_1)
 for i in range(2,4):
     url_n = "https://sc.chinaz.com/jianli/free_{}.html".format(i)
     list_url.append(url_n)
# 循环取出url请求
for url in list_url:
    page_text = requests.get(url, headers=headers).text
    tree = etree.HTML(page_text)
    jianli_list = []
    jianli_div = tree.xpath("//div[@id='main']/div/div")
    for a in jianli_div:
        jianli_web = 'https:' + a.xpath("a/@href")[0]
        print(jianli_web)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢,就是差那临门一脚,原来如此。。哈哈。憋了我几天了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

您的代码我跑了一下,好像是可以指定页的爬取。收藏了,多看看前辈代码学习经验
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请问下前辈,为什么在for循环里 假如爬取的是第二页或后面页,可以执行最后用前缀加nx_url拼好的url来发起get请求呢?而不是用最上面resulr下一行定义好的url呢?
想知道小甲鱼最近在做啥?请访问 -> 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已经不一样了,这样说能明白?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

result下面那个 ...

感觉有点是懂非懂。。可能是我代码写少了。。。 最近多看看大佬的代码。。自己去摸索哈。。感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 01:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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