XPath解析中的 ‘Element a at 0x5308a80’是什么

XPath解析中的 ‘Element a at 0x5308a80’是什么话不多说,直接上代码以链家网为例,解析网页打印出来的东西居然不是想象中的html文件,而是“<Elementhtmlat0x52e5c10>”这么个东西。这个东西其实是一个元素,后面会介绍到。现在还是说说怎么把这个东西变成我们能看懂的html内容吧。fromlxmlimportetreeimportrequestsfromlxml.htmlimport…


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

话不多说,直接上代码

以链家网为例,解析网页打印出来的东西居然不是想象中的html文件,而是“<Element html at 0x52e5c10>”这么个东西。这个东西其实是一个元素,后面会介绍到。现在还是说说怎么把这个东西变成我们能看懂的html内容吧。

from lxml import etree
import requests
from lxml.html import fromstring, tostring

url = 'http://sh.lianjia.com/ershoufang/pudong'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36'}
res = requests.get(url,headers=headers)
tree = etree.HTML(res.text)

print(tree)

XPath解析中的 'Element a at 0x5308a80'是什么

 要将element转成能看懂的html内容,需要进行先tostring,然后decode编码,代码如下:

from lxml import html
from html.parser import HTMLParser

#转为string
tree1 = html.tostring(tree[0])
#编码'utf-8'
tree2 = HTMLParser().unescape(tree1.decode('utf-8'))
print(tree2)

上面的代码等价于:

tree3 = html.tostring(tree[0],encoding='utf-8').decode('utf-8')
print(tree3)

结果如下图,看起来舒服多了(至少有汉字能看懂了,不至于一脸懵A+) 

XPath解析中的 'Element a at 0x5308a80'是什么

什么是element?

element上面说到,这个东西其实是一个元素,它的类型是’lxml.etree._Element’。

如下面的例子,element的tag值取到的是标签名,attrib获取到的是节点标签的属性,text获取到的是标签文本(例子里的标签文本为空,所以取None)

from lxml import etree
import requests
from lxml.html import fromstring, tostring

url = 'http://sh.lianjia.com/ershoufang/pudong'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36'}
res = requests.get(url,headers=headers)
dom_tree = etree.HTML(res.text)

res = dom_tree.xpath('//li')[5]
res1 = html.tostring(res)
res2 = HTMLParser().unescape(res1.decode('utf-8'))

print(res)
print(res2)
print(res.tag)
print(res.attrib)
print(res.text)

XPath解析中的 'Element a at 0x5308a80'是什么

一个例子

在实际应用中,我们会在xpath后面加上方法取出文本值或者属性值,如下面的例子,加上“/text()”可以取出文本值,加上“/@href’”可以取出href值(节点属性其实还是用@符号就可以获取,在例子中,如果要取“data-housecode=”107101428480″”中的号码,加上“/@data-housecode”即可)

from lxml import etree
import requests
from lxml.html import fromstring, tostring

url = 'http://sh.lianjia.com/ershoufang/pudong'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36'}
resl = requests.get(url,headers=headers)
tree = etree.HTML(resl.text)

res = tree.xpath('//ul[@class="sellListContent"]//div[@class="info clear"]//div[@class="title"]//a')[0]
res1 = html.tostring(res)
res2 = HTMLParser().unescape(res1.decode('utf-8'))

#用“/text()”取出文本值
text = tree.xpath('//ul[@class="sellListContent"]//div[@class="info clear"]//div[@class="title"]//a/text()')[0]

#用“/@href'”取出href值
href = tree.xpath('//ul[@class="sellListContent"]//div[@class="info clear"]//div[@class="title"]//a/@href')[0]

print(res)
print('===============================')
print(res2)
print('===============================')
print(text)
print('===============================')
print(href)

XPath解析中的 'Element a at 0x5308a80'是什么

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196462.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • spring自己实现注解(自定义注解方法名)

    本篇博客将从一个普通的spring项目入手,教你如何在项目中应用自定义注解

    2022年4月13日
  • 【转载】HTTP和SOAP完全就是两个不同的协议

    【转载】HTTP和SOAP完全就是两个不同的协议

    2021年11月18日
  • discuz 二次开发[通俗易懂]

    discuz 二次开发[通俗易懂]转载地址:http://www.cnblogs.com/LY-leo/p/5843439.htmldiscuz框架也算是比较流行的社区论坛框架,discuz的基础架构采用世界上最流行的web编程组合PHP +MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案。1、安装discuz先下载 discuz的安装包,解压之后有3个文件,如下:

    2022年5月20日
  • Activiti工作流使用之项目实例

    Activiti工作流使用之项目实例Activiti工作流使用之项目实例文章目录Activiti工作流使用之项目实例一、配置文件1.1pom依赖引入1.2application.properties文件二、BPMN文件三、控制层Controller四、实现类Service4.1流程启动(不进入下一环节)4.2流程启动(直接进入下一环节)4.3审批任务4.4查询我发起的流程4.5流程下任务详情4.6删除流程4.7我待审核的任务五、监听器六、流程示意一、配置文件1.1pom依赖引入<dependency>

    2022年10月5日
  • c语言字符数组的初始化的三种方式_字符数组用16进制初始化

    c语言字符数组的初始化的三种方式_字符数组用16进制初始化1、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。charstr[10]={‘I’,”,’a’,’m’,”,‘h’,’a’,’p’,’p’,’y’};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空

    2022年10月8日
  • 详解 & 0xff 的作用

    详解 & 0xff 的作用首先我们要都知道,&表示按位与,只有两个位同时为1,才能得到1,0x代表16进制数,0xff表示的数二进制11111111占一个字节.和其进行&操作的数,最低8位,不会发生变化.下面着重来说说&0xff都有哪些应用:1.只是为了取得低八位通常配合移位操作符>>使用例如:javasocket通信中基于长度的成帧方法中,如果发送的信息长度小于65…

    2022年6月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号