import requests
from lxml import etree
url = 'https://dblp.org/pers/hd/p/Petersen:Karin'
html = requests.get(url)
html = etree.HTML(html.text) #初始化生成一个XPath解析对象
items = html.xpath('//div[contains(@class,"data")]/span//text()')
for i in items:
print(i)
下面是表达式的常用用法:
路径表达式:
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 通配符,选择所有元素节点与元素名 |
@* | 选取所有属性 |
[@attrib] | 选取具有给定属性的所有元素 |
[@attrib='value'] | 选取给定属性具有给定值的所有元素 |
[tag] | 选取所有具有指定元素的直接子节点 |
[tag='text'] | 选取所有具有指定元素并且文本内容是text节点 |
html.xpath('//li') #获取所有子孙节点的li节点
html.xpath('//li/a') #获取所有子孙节点的li节点下的所有直接a节点
result=html.xpath('//li[@class="item"]') 匹配class="item"的li
html.xpath('//a[@href="tab"]/../@class') 获取a的父节点的class值
html.xpath('//a[@href="tab"]/parent::*/@class')获取a的父节点的class值
html.xpath('//li[@class="item"]/a/text()') #获取a节点下的内容
html.xpath('//li[@class="item"]//text()') #获取li下所有子孙节点的内容
html.xpath('//li/a/@href') #获取a的href属性
html.xpath('//li//@href') #获取所有li子孙节点的href属性
按熟悉选择
html.xpath('//li[@class="aaa"]/a') 只能匹配class仅为'aaa'的节点
html.xpath('//li[contains(@class,"aaa")]/a') 匹配class有'aaa'的节点
#and or 的用法
html.xpath('//li[@class="aaa" and @name="fore"]/a/text()')
html.xpath('//li[contains(@class,"aaa") and @name="fore"]/a/text()')
#按顺序选择
html.xpath('//li[1]/a/text()') #获取第一个li下a的内容
html.xpath('//li[last()]/a/text()') #获取最后一个li下a的内容
html.xpath('//li[position()>2 and position()<4]/a/text()') #获取大于2小于4的
html.xpath('//li[last()-2]/a/text()') #获取倒数第三个
#XPath提供了很多节点选择方法,包括获取子元素、兄弟元素、父元素、祖先元素等,示例如下:
html.xpath('//li[1]/ancestor::*') #获取所有祖先节点
html.xpath('//li[1]/ancestor::div') #获取div祖先节点
html.xpath('//li[1]/attribute::*') #获取所有属性值
html.xpath('//li[1]/child::*') #获取所有直接子节点
html.xpath('//li[1]/descendant::a') #获取所有子孙节点的a节点
html.xpath('//li[1]/following::*') #获取当前子节之后的所有节点
html.xpath('//li[1]/following-sibling::*') #获取当前节点的所有同级节点