网页数据提取requests+etree

针对网页数据的分析提取,很多都是推荐bs4,个人比较喜欢etree,简单方便。

大致的逻辑就是先requests请求某一个url,得到网页的源代码(pages.content),然后通过etree对源代码格式化,变成可解析的格式(etree.HTML),然后再用xpath提取你需要的内容就可以了,简单的demo如下,提取一个问卷调查的部分内容

import requests
from lxml import etree
import sys

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36','referer':"www.mmjpg.com" }
all_url = 'https://www.wjx.cn/jq/2087221.aspx'
pages=requests.get(all_url,headers=headers)
selector = etree.HTML(pages.content)
for i in range(2,20):
    data=selector.xpath(f'//*[@id="divTitle{i}"]/text()')[0]
    sys.stdout.write(f"{i}: "+data+'\n')
    chooses=selector.xpath(f'//*[@id="divquestion{i}"]/ul/li/label/text()')
    for ch in chooses:
        sys.stdout.write(ch)

常用的xpath方法如下:

# http://blog.csdn.net/zheng12tian/article/details/40617303
# XPath 基础表达式:
/node         表示在xml文档的根目录查找结点名称为node的结点
./node        表示在当前结点下查找结点名称为node的结点
//node        表示在xml文档中递归查找结点名称为node的节点
//*       表示在xml文档中查询所有的结点,但是排除文本节点
//node()          表示在xml文档中查询所有结点,包含文本节点
//text()          表示在xml文档中递归查找所有的文本节点
//*/text()[contains(., 'test')]       表示在xml文档中递归查找所有结点,条件为该结点的文本节点包含"test"
//node[@id]       表示在xml文档中递归查找结点名称为node的结点,条件为该结点必须含有id属性
//node[id]        表示在xml文档中递归查找结点名称为node的结点,条件为该结点必须含有结点名称为id的结点
//nodes[node/id]          表示递归查找nodes结点,条件为nodes结点下必须有node结点,且node结点下必须有id结点
//nodes[@id]/node[id]         表示递归查找含有id属性的nodes结点下的node结点,条件为node结点下必须含有id结点
//nodes[@id]/node[0]          表示递归查找含有id属性的nodes结点下的第一个node结点
//nodes[@id]/node[last()]         表示递归查找含有id属性的nodes结点下的最后一个node结点
//nodes/node[position() < 4]          表示递归查找nodes结点下索引小于4的node结点
//nodes[@id]/node[position() < last()]        递归查找含有id属性的nodes结点下除最后一个结点外的node结点
/nodes/child::node()[name()='node']       表示查找nodes结点下结点名称为node的子结点
/nodes/child::node        等同于/nodes/node表示查找nodes下的node子结点
/nodes/node/attribute::id         等同于/nodes/node/@id表示查找nodes结点下的node结点的id属性
//nodes[@id='1001']/node[starts-with(@id, '1')]       表示查找id属性为1001的nodes结点下的id属性以1开头的node结点
//@*[ends-with(., '1')]       表示查找以1结尾所有属性
(//* | //@*)[substring(name(), 1, 5) = 'class']       查找所有结点名称或属性名称的1到5之间的字符等于'class'的结点
//node[@attr!='-2' and @attr!='2']        查找所有node节点,其attr属性不等于2和-2

# XPath 文档轴用途: 
self                选择当前节点
parent              选择当前节点的父节点
child               选择当前节点的所有子节点
attribute           选择当前节点的所有属性
ancestor            选择当前节点的所有祖先,包括父节点、父节点的父节点等等
ancestor-or-self    选择当前节点的祖先以及当前节点本身
descendant          选择当前节点的所有后代,包括子节点、子节点的子节点等等
descendant-or-self  选择当前节点的后代以及当前节点本身
preceding           选择整个文档中出现在当前节点前面的所有节点
preceding-sibling   选择文档中出现在当前节点前面的所有同胞节点(即与当前节点同级的节点)
following           选择整个文档中出现在当前节点后面的所有节点
following-sibling   选择文档中出现在当前节点后面的所有同胞节点(即与当前节点同级的节点)
namespace           选择当前节点的所有名称空间节点

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值