鱼C论坛

 找回密码
 立即注册
查看: 3809|回复: 7

[已解决]xpath如何获取两个span标签内的内容

[复制链接]
发表于 2020-12-14 14:29:45 | 显示全部楼层 |阅读模式

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

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

x
各位大佬,最新想爬个小说来看,地址:http://minguodaomuwangshi.wddsnxn.org/,页面是按卷分类的,卷的名字和卷内每一章的span标签没有上下级的关系,如下图,统一都在div[@class="booklist clearfix"]这一级下面,请问有没有什么办法可以获取两个卷名span标签之间的所有章节span呢。
1.jpg
最佳答案
2020-12-14 16:38:17
本帖最后由 suchocolate 于 2020-12-14 18:54 编辑
罗同学 发表于 2020-12-14 16:00
大佬、不是这个需求啊,网页是有一个卷名,第一卷第二卷这种的,是想获取比如第一卷里面的所有标签,因为 ...


a空为章节标题,加入总结果列表,并记录其index,如果只取其中一部分内容,那么按照index标号range去取就可以了。
import requests
from lxml import etree


def main():
    url = 'http://minguodaomuwangshi.wddsnxn.org/'
    headers = {'user-agent': 'firefox'}
    r = requests.get(url, headers=headers)
    html = etree.HTML(r.text)
    vols = html.xpath('//div[@class="booklist clearfix"]/span[@class="v"]/text()')
    vol_index = []
    n = 0
    result = []
    spans = html.xpath('//div[@class="booklist clearfix"]/span')
    for span in spans:
        link = span.xpath('./a/@href')
        text = span.xpath('./a/text()')
        if link:
            # print(text, link)
            result.append([text[0], link[0]])
        else:
            result.append([vols[n]])
            vol_index.append(len(result) - 1)
            n = n + 1
    print(f'章节inex:{vol_index}')
    print(result)


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

使用道具 举报

发表于 2020-12-14 15:46:04 | 显示全部楼层
import requests
from lxml import etree


def main():
    url = 'http://minguodaomuwangshi.wddsnxn.org/'
    headers = {'user-agent': 'firefox'}
    r = requests.get(url, headers=headers)
    html = etree.HTML(r.text)
    spans = html.xpath('//div[@class="booklist clearfix"]/span')
    for span in spans:
        link = span.xpath('./a/@href')
        text = span.xpath('./a/text()')
        print(text, link)


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

使用道具 举报

 楼主| 发表于 2020-12-14 16:00:32 | 显示全部楼层

大佬、不是这个需求啊,网页是有一个卷名,第一卷第二卷这种的,是想获取比如第一卷里面的所有标签,因为卷名和章节的名字没有从属关系,就不知道怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-14 16:38:17 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2020-12-14 18:54 编辑
罗同学 发表于 2020-12-14 16:00
大佬、不是这个需求啊,网页是有一个卷名,第一卷第二卷这种的,是想获取比如第一卷里面的所有标签,因为 ...


a空为章节标题,加入总结果列表,并记录其index,如果只取其中一部分内容,那么按照index标号range去取就可以了。
import requests
from lxml import etree


def main():
    url = 'http://minguodaomuwangshi.wddsnxn.org/'
    headers = {'user-agent': 'firefox'}
    r = requests.get(url, headers=headers)
    html = etree.HTML(r.text)
    vols = html.xpath('//div[@class="booklist clearfix"]/span[@class="v"]/text()')
    vol_index = []
    n = 0
    result = []
    spans = html.xpath('//div[@class="booklist clearfix"]/span')
    for span in spans:
        link = span.xpath('./a/@href')
        text = span.xpath('./a/text()')
        if link:
            # print(text, link)
            result.append([text[0], link[0]])
        else:
            result.append([vols[n]])
            vol_index.append(len(result) - 1)
            n = n + 1
    print(f'章节inex:{vol_index}')
    print(result)


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

使用道具 举报

发表于 2020-12-14 18:54:50 | 显示全部楼层
尝试了xpath的模糊定位配合轴定位
//span[contains(text(),"卷二")]/preceding-sibling::span[@class=""]
勉强能满足楼主的需求,但这个只能满足当前书籍卷一采集的情况,批量采集可能行不通
后面的卷数(卷三  卷四等)用上面的更行不通,后来继续改换思路
卷一 //span[contains(text(),"全部")]/following-sibling::span[position()<70]

卷二 //span[contains(text(),"卷二")]/following-sibling::span[position()<72]

卷三 //span[contains(text(),"卷三")]/following-sibling::span[position()<75]

卷四 //span[contains(text(),"卷四")]/following-sibling::span[position()<79]

卷五 //span[contains(text(),"卷五")]/following-sibling::span[position()<80]

卷六 //span[contains(text(),"卷六")]/following-sibling::span[position()<81]

卷七 //span[contains(text(),"卷七")]/following-sibling::span[position()<70]

如果是这样的话  分卷采集应该就没有问题了
主要还是网站的问题 如果分卷标题和分卷章节节点为父子关系,xpath写起来会容易很多


可惜不是悬赏贴 不然还能赚点鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-15 15:19:51 | 显示全部楼层
孤独的嫖客 发表于 2020-12-14 18:54
尝试了xpath的模糊定位配合轴定位
勉强能满足楼主的需求,但这个只能满足当前书籍卷一采集的情况,批量采集 ...

是啊是啊、要是节点有父子关系就好写了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 19:33:15 | 显示全部楼层
罗同学 发表于 2020-12-15 15:19
是啊是啊、要是节点有父子关系就好写了

应该我是最佳啊?
这节点都给你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-15 19:53:12 | 显示全部楼层
为什么不直接用个循环...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 00:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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