• 如何解决python xpath爬取页面得到空列表(语法都对的情况下)


    引言:

    很多网页呈现给我们的静态页面,但是实际上是由服务器端的动态页面生成的。再加上网站设有反爬虫机制,所以抓取到的页面不一定和源码相同。

    所以!!从源码里copy xpath,不一定能取到数据!

    实例:

    非常的简单,从百度首页上,抓取“新闻”这两个字。

    import requests
    from lxml import etree
    url="http://www.baidu.com"
    ua={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
    bd = requests.get(url, headers=ua)
    bd.encoding='utf-8'

    接下来打印一下我们抓取到的页面

    print(bd.text)

    看不出来啥,当然了,不出问题的话,你会以为这就是页面的源码。

    然后我们试一下打印“百度一下“这个按钮的文本。

    numl=html.xpath('//*[@id="su"]//@value')
    输出:百度一下
    

     好,可以,没问题。

    试一下打印”新闻“。网页源码上 新闻、地图、贴吧.... 这些<a>标签都在一个id为"u_sp"的div下,那么:

    res = html.xpath('//*[@id="u_sp"]/a[1]//text()')

     这样写,能输出”新闻“在理论上是没错的,但我特喵搞了好久,啊喂怎么老是空啊?

    id不行我试试class吧,这几个<a>标签的class都是”mnav",

    res = html.xpath('//*[@class="mnav"]//text()')

    输出:['新闻', 'hao123', '地图', '视频', '贴吧', '学术']

    res = html.xpath('//*[@class="mnav"]//text()')[0]

    输出:['新闻']

    看来,class可以,那id为什么不行,也不是所有的id不行,刚才“百度一下”就可以的啊。

    看了一下打印出来的抓取的页面代码,????id什么时候成了"u1"了,谷歌浏览器查看源码明明是“u_sp”啊!

    于是,

    res = html.xpath('//*[@id="u1"]/a[1]//text()')
    

     输出:['新闻']

    学习之路漫长......

  • 相关阅读:
    JavaScript中常见的十五种设计模式
    如何使 highchart图表标题文字可选择复制
    python如何以表格形式打印输出
    记一次vue长列表的内存性能分析和优化
    如何收集常见的前端性能信息
    如何实现同等间隙的卡片布局
    图片横向等高瀑布流,每行占满,限制行数 的实现
    弹窗查看内容时 内容滚动区域设置为body区
    卡片列表项缓缓往下展示 效果实现
    【年终总结】微信前端社招有感
  • 原文地址:https://www.cnblogs.com/Amy-is-a-fish-yeah/p/11788464.html
Copyright © 2020-2023  润新知