罗同学 发表于 2020-12-14 14:29:45

xpath如何获取两个span标签内的内容

各位大佬,最新想爬个小说来看,地址:http://minguodaomuwangshi.wddsnxn.org/,页面是按卷分类的,卷的名字和卷内每一章的span标签没有上下级的关系,如下图,统一都在div[@class="booklist clearfix"]这一级下面,请问有没有什么办法可以获取两个卷名span标签之间的所有章节span呢。

suchocolate 发表于 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()

罗同学 发表于 2020-12-14 16:00:32

suchocolate 发表于 2020-12-14 15:46


大佬、不是这个需求啊,网页是有一个卷名,第一卷第二卷这种的,是想获取比如第一卷里面的所有标签,因为卷名和章节的名字没有从属关系,就不知道怎么写{:10_282:}

suchocolate 发表于 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(, link])
      else:
            result.append(])
            vol_index.append(len(result) - 1)
            n = n + 1
    print(f'章节inex:{vol_index}')
    print(result)


if __name__ == '__main__':
    main()

孤独的嫖客 发表于 2020-12-14 18:54:50

尝试了xpath的模糊定位配合轴定位//span/preceding-sibling::span[@class=""]
勉强能满足楼主的需求,但这个只能满足当前书籍卷一采集的情况,批量采集可能行不通
后面的卷数(卷三卷四等)用上面的更行不通,后来继续改换思路
卷一 //span/following-sibling::span

卷二 //span/following-sibling::span

卷三 //span/following-sibling::span

卷四 //span/following-sibling::span

卷五 //span/following-sibling::span

卷六 //span/following-sibling::span

卷七 //span/following-sibling::span

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


可惜不是悬赏贴 不然还能赚点鱼币

罗同学 发表于 2020-12-15 15:19:51

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

是啊是啊、要是节点有父子关系就好写了{:10_243:}

孤独的嫖客 发表于 2020-12-15 19:33:15

罗同学 发表于 2020-12-15 15:19
是啊是啊、要是节点有父子关系就好写了

应该我是最佳啊?
这节点都给你了

温木zou 发表于 2020-12-15 19:53:12

为什么不直接用个循环...
页: [1]
查看完整版本: xpath如何获取两个span标签内的内容