当前位置: 首页 > news >正文

天猫网站做的比京东好搜狗快速收录方法

天猫网站做的比京东好,搜狗快速收录方法,wordpress安装php,招工网站怎么做XPath XPath,全称 XML Path Language,即 XML 路径语⾔,它是⼀⻔在 XML ⽂档中查找信息的语⾔。最初是⽤来搜寻 XML ⽂档的,但同样适⽤于 HTML ⽂档的搜索。所以在做爬⾍时完全可以使⽤ XPath做相应的信息抽取。 1、XPath概览 X…

XPath

XPath,全称 XML Path Language,即 XML 路径语⾔,它是⼀⻔在 XML ⽂档中查找信息的语⾔。最初是⽤来搜寻 XML ⽂档的,但同样适⽤于 HTML ⽂档的搜索。所以在做爬⾍时完全可以使⽤ XPath做相应的信息抽取。

1、XPath概览

XPath 的选择功能⼗分强⼤,它提供了⾮常简洁明了的路径选择表达式。另外,它还提供了超过100 个内建函数,⽤于字符串、数值、时间的匹配以及节点、序列的处理等,⼏乎所有想要定位的节点都可以⽤ XPath 来选择。     
官⽅⽂档: https://www.w3.org/TR/xpath/

2、XPath常用规则

在这里插入图片描述
这里列出了XPath的常用规则, 示例如下:

//title[@lang=‘eng’]
这是⼀个 XPath 规则,代表的是选择所有名称为 title,同时属性 lang 的值为 eng 的节点,后⾯会
通过 Python 的 lxml 库,利⽤ XPath 进⾏ HTML 的解析。

3、安装

windows—>pyton3环境下: pip install lxml
linux环境下: pip install lxml

4、实例引入

from lxml import etree
text = ''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>

⾸先导⼊ lxml 库的 etree 模块,然后声明⼀段 HTML ⽂本,调⽤ HTML 类进⾏初始化,成功构造⼀个 XPath 解析对象。注意: HTML ⽂本中最后⼀个 li 节点没有闭合,但是 etree 模块可以⾃动修正HTML ⽂本。调⽤ tostring() ⽅法即可输出修正后的 HTML 代码,但结果是 bytes 类型,可以⽤decode() ⽅法将其转化为 str 类型,结果如下:

<html><body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div>
</body></html>

经过处理后, li 节点标签被补全,并且还⾃动添加了 body、 html 节点。还可以直接读取⽂本⽂件进⾏解析:

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

test.html 的内容就是上⾯例⼦的 HTML 代码,内容如下:

<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>

这次输出结果略有不同,多了⼀个DOCTYPE 声明,不过对解析没有任何影响,结果如下:

<html><body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div></body></html>

在python中使⽤xpath

from lxml import etree
# 第⼀种⽅式,直接在python代码中解析html字符串
text = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
....
</ul>
</div>
"""
resp_html = etree.HTML(text)
#第⼆种⽅式,读取⼀个html⽂件并解析
html = etree.parse('./test.html', etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

5、所有节点

⽤以 // 开头的 XPath 规则来选取所有符合要求的节点:

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//*')
print(result)
# 运⾏结果
"""
[<Element html at 0x1d6610ebe08>, <Element body at 0x1d6610ebf08>,
<Element div at 0x1d6610ebf48>, <Element ul at 0x1d6610ebf88>,
<Element li at 0x1d6610ebfc8>, <Element a at 0x1d661115088>,
<Element li at 0x1d6611150c8>, <Element a at 0x1d661115108>,
<Element li at 0x1d661115148>, <Element a at 0x1d661115048>,
<Element li at 0x1d661115188>, <Element a at 0x1d6611151c8>,
<Element li at 0x1d661115208>, <Element a at 0x1d661115248>]
"""
  • 代表匹配所有节点,返回的结果是⼀个列表,每个元素都是⼀个 Element 类型,后跟节点名称。
    也可以指定匹配的节点名称:
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li')
print(result)
# 运⾏结果
[<Element li at 0x23fb219af08>, <Element li at 0x23fb219af48>, <Element li at
0x23fb219af88>,
<Element li at 0x23fb219afc8>, <Element li at 0x23fb21c5048>]
<Element li at 0x23fb219af08>

取出其中某个对象时可以直接⽤索引。

6、子节点

通过 / 或 // 即可查找元素的⼦节点或⼦孙节点。选择 li 节点的所有直接 a ⼦节点:

from lxml import etree
html = etree.parse('.test.html', etree.HTMLParser())
result = html.xpath('//li/a')
print(result)

此处的 / ⽤来获取直接⼦节点,如果要获取所有⼦孙节点,将 / 换成 // 即可。

7、父节点

知道⼦节点,查询⽗节点可以⽤ … 来实现:

# 获得 href 属性为 link4.html 的 a 节点的⽗节点的 class 属性
# ⽅法⼀
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)
# ⽅法⼆
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/parent::*/@class')
print(result)
# 运⾏结果: ['item-1']

8、属性匹配

匹配时可以⽤@符号进⾏属性过滤:

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-inactive"]')
print(result)
# 运⾏结果: [<Element li at 0x2089793a3c8>]

9、文本获取

有两种⽅法:⼀是获取⽂本所在节点后直接获取⽂本,⼆是使⽤ //。

# 第⼀种
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)
# 第⼆种
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]//text()')
print(result)

第⼆种⽅法会获取到补全代码时换⾏产⽣的特殊字符,推荐使⽤第⼀种⽅法,可以保证获取的结果是整洁的。

10、属性获取

在xpath语法中,@符号相当于过滤器,可以直接获取节点的属性值:

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li/a/@href')
print(result)
# 运⾏结果: ['link1.html', 'link2.html', 'link3.html', 'link4.html',
'link5.html']

11、属性多值匹配

有时候,某些节点的某个属性可能有多个值:

from lxml import etree
text = '''
<li class="li li-first"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)
# 运⾏结果: ['first item']

12、多属性匹配

当前节点有多个属性时,需要同时进行匹配:

from lxml import etree
text = '''
<li class="li li-first" name="item"><a href="link.html">first item</a></li>
'''
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
print(result)
# 运⾏结果: ['first item']

扩展:XPath运算符
在这里插入图片描述

13、按序选择

匹配结果有多个节点,需要选中第二个或者最后一个,可以按照中括号内加索引或其他相应语法获得:

from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html = etree.HTML(text)
# 获取第⼀个
result = html.xpath('//li[1]/a/text()')
print(result)
# 获取最后⼀个
result = html.xpath('//li[last()]/a/text()')
print(result)
# 获取前两个
result = html.xpath('//li[position()<3]/a/text()')
print(result)
# 获取倒数第三个
result = html.xpath('//li[last()-2]/a/text()')
print(result)
"""
运⾏结果:
['first item']
['fifth item']
['first item', 'second item']
['third item']
"""

XPath 中提供了100多个函数,包括存取、数值、逻辑、节点、序列等处理功能,具体作⽤可以参考: http://www.w3school.com.cn/xpath/xpath_functions.asp

14、节点轴选择

XPath提供了很多节点轴选择方法,包括子元素,父元素,祖先元素等:

from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html"><span>first item</span></a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html = etree.HTML(text)
# 获取所有祖先节点
result = html.xpath('//li[1]/ancestor::*')
print(result)
# 获取 div 祖先节点
result = html.xpath('//li[1]/ancestor::div')
print(result)
# 获取当前节点所有属性值
result = html.xpath('//li[1]/attribute::*')
print(result)
# 获取 href 属性值为 link1.html 的直接⼦节点
result = html.xpath('//li[1]/child::a[@href="link1.html"]')
print(result)
# 获取所有的的⼦孙节点中包含 span 节点但不包含 a 节点
result = html.xpath('//li[1]/descendant::span')
print(result)
# 获取当前所有节点之后的第⼆个节点
result = html.xpath('//li[1]/following::*[2]')
print(result)
# 获取当前节点之后的所有同级节点
result = html.xpath('//li[1]/following-sibling::*')
print(result)
"""
[<Element html at 0x231a8965388>, <Element body at 0x231a8965308>, <Element
div at 0x231a89652c8>, <Element ul at 0x231a89653c8>]
[<Element div at 0x231a89652c8>]
['item-0']
[<Element a at 0x231a89653c8>]
[<Element span at 0x231a89652c8>]
[<Element a at 0x231a89653c8>]
[<Element li at 0x231a8965308>, <Element li at 0x231a8965408>, <Element li at
0x231a8965448>, <Element li at 0x231a8965488>]
"""

更多参考文档:轴的用法: http://www.w3school.com.cn/xpath/xpath_axes.asp XPath 的⽤法: http://www.w3school.com.cn/xpath/index.asp Python lxml 的⽤法: http://lxml.de

http://www.lbrq.cn/news/2623591.html

相关文章:

  • 电商网站建设 网站定制开发代理公司注册
  • 网上注册公司需要多少钱搜索引擎优化方法有哪些
  • 自己如何做团购网站百度24小时人工客服电话
  • 临海大经建设集团网站搜易网提供的技术服务
  • 现在 做网站 技术路线网站制作的流程
  • 帮做网站今日头条新闻10条
  • 网站建设案例 优帮云免费建设网站平台
  • 做网站需要哪些流程最大的中文搜索引擎
  • 德州网站建设维护看广告赚钱一天50元
  • 凡科做的网站真是免费吗搜索引擎排行榜前十名
  • 河南微网站建设公司哪家好站长统计app
  • seo 网站换程序优秀软文范例800字
  • 网站怎么做vga头百度投放广告收费标准
  • 中山有做网站的公司吗seo教程技术优化搜索引擎
  • 用网页制作个人网站软文拟发布的平台与板块
  • 查询公司蔡甸seo排名公司
  • kol营销重庆seo排名方法
  • 网站建设从入门到精通 网盘福州seo网络推广
  • 营销型网站可以吗0元入驻的电商平台
  • 武汉网站优化方案经典软文文案
  • 创建网站大约多少钱2018新东方一对一辅导价格
  • wordpress首页怎么打开很慢如何优化网络速度
  • 德州做网站优化如何找友情链接
  • 网站企业模板微信引流推广怎么做
  • 3g网站跳转google关键词
  • 麦田 网站建设推广自己的网站
  • 商务网站建设与维护流程百度指数趋势
  • 大兴智能网站建设哪家好seo客服
  • 武汉网站制作在线百度推广关键词多少合适
  • 成都网站制作电话百度企业推广
  • sigfillset 函数详解
  • VC6800智能相机:赋能智能制造,开启AI视觉新纪元
  • 38.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加日志记录器
  • Rust进阶-part5-trait
  • Selenium在Pyhton应用
  • C++之vector类的代码及其逻辑详解 (下)