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

以链家网为例,解析网页打印出来的东西居然不是想象中的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)


 要将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+) 

什么是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后面加上方法取出文本值或者属性值,如下面的例子,加上“/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)

————————————————
版权声明:本文为CSDN博主「J符离」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22592457/article/details/95490976

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值