c#怎么用xpath解析html

c#怎么用xpath解析html,第1张

HOT SUMMER

每天都是不一样,积极的去感受生活

C#Xpath解析HtmlDocument的使用方法与递归取得页面所有标签xpath值(附源码)

在学习HTML Xpath之前呢我们先来下载一下Dll文件

下载地址:http://htmlagilitypack.codeplex.com/

大家下载单击如下图片下载就行了

<ignore_js_op>

接下来就是在程序中引用一下,

<ignore_js_op>

然后就可以直接调用 了,大家看看

代码吧

普通浏览复制代码

//htmlDcoument对象用来访问Html文档s

HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.HtmlDocument()

//加载Html文档

hd.LoadHtml(strhtml)

string str = hd.DocumentNode.SelectSingleNode("//*[@id='e_font']").OuterHtml

这样就可以得到一个标签的HTml代码了

OuterHtml是取包含本身的Html如果是InnerHtml就是取的包含在这个标签之内的所有Html代码了

这点大家要注意了

如果大家想获取Html代码的Xpath路径就是这部分

//*[@id='e_font']

复制代码

这个其实很简单只在大家安装一个Firbug就行了,

看下图片

<ignore_js_op>

大家只要进入选择模式,然后选择你要的内容,然后右键复制一下就行了。

然后放在SelectSingleNode()方法里就OK了

下面我说说几个方法和属性的意思吧、

方法

SelectNodes 获取的是一个集合

SelectSingleNode 获取一个标签

SetAttributeValue 设置标签的属性值例如:SetAttributeValue("name","xpath-89")这说明把name属性的值修改为xpath-89

属性

OuterHtml 是取包含本身的Html

InnerHtml 取的包含在这个标签之内的所有Html代码了

XPath 获取相对应的Xpath值

Attributes 获取一个属性的值例如:Attributes("name")

也可以进行添加属性例如:

普通浏览复制代码

hd.DocumentNode.SelectSingleNode(item.Key).Attributes.Add("xpathid", "xpath_1" )

下面我写了一个递归获取Html页面所有Xpath值的方法大家看一下吧

普通浏览复制代码

//key(Xpath),value(整个节点)

xPath 是一种html和xml的查询语言,能在其树状结构中寻找节点。

LXML安装:pip install lxml

——xPath使用-----------------------------------------------------------------------------------

获取文本:

//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/.../text()

获取属性值

//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/.../@属性n

eg:-------------------------------------------------------------------

from lxml import html

def parse():

"""将html文件中内容 使用xpath进行提取"""

    #读取文件中的内容

    f =open('./static/index.html', 'r', encoding='utf-8')

    s = f.read()

    selector = html.fromstring(s)

# 解析a 标签内容

    a = selector.xpath('//div[@id="container"]/a/text()')

    print(a[0])

# 解析href属性

    alink = selector.xpath('//div[@id="container"]/a/@href')

    print(alink[0])

    f.close()

if __name__=='__main__':

    parse()

看下面一些例子:

1)获取子节点:getchildren()等价于child::*

>>>doc.getchildren()

2)获取当前节点:"."等价于self::node()

>>>doc.xpath(".")

>>>doc.xpath("self::node()")

3)获取父节点:".."等价于parent::node()

>>>doc.head.xpath("..")

>>>doc.head.xpath("parent::node()")

4)ancestor轴和descendant轴

分别代表当前元素所有祖先元素、所有后代元素,比如:

>>>meta.xpath('ancestor::*')

>>>meta.xpath('ancestor::head')

>>>doc.xpath('descendant::table')

>>>doc.xpath('descendant::table[@id="tcdatafields"]')

>>>doc.xpath('//table[@id="tcdatafields"]')

5)ancestor-or-self和descendant-or-self轴

分别表示当前元素或其所有祖先元素、当前元素或其所有后代元素,比如:

>>>meta.xpath('ancestor-or-self::*')

,,]

6)child和parent轴

分别表示当前元素所有子元素、父元素:

>>>doc.xpath('child::head')

>>>head.xpath('child::meta[1]')

>>>head.xpath('child::meta[position()<3]')

7)attribute轴

表示当前元素的所有属性,例如下面是meta元素的name和content两个属性以及取值:

>>>meta.items()

[('name','googlebot'),('content','index,follow')]

获取所有属性取值:

>>>meta.xpath('attribute::*')

['googlebot','index,follow']

获取name属性的取值:

>>>meta.xpath('attribute::name')

['googlebot']

8)following和preceding

分别表示当前元素的所有后继元素、前置元素,比如:

>>>meta.xpath('following::*')

>>>meta.xpath('preceding::*')

9)following-sibling和preceding-sibling轴

分别表示当前元素的所有平级后继元素、平级前置元素,比如:

>>>meta.xpath('preceding-sibling::*')

>>>meta.xpath('following-sibling::*')

10)self轴

表示当前元素自身

>>>doc.xpath("self::*")

使用谓词(predicates)

谓词就是step中使用中括号[...]定义的那部分,使用谓词能实现精确查找,看下面的例子:

>>>doc.xpath('/html/head/meta')

,,,,,,]

1)位置谓词

>>>doc.xpath('/html/head/meta[1]')

>>>doc.xpath('/html/head/meta[2]')

>>>doc.xpath('/html/head/meta[last()]')

>>>doc.xpath('/html/head/meta[last()-1]')

>>>doc.xpath('/html/head/meta[position()<3]')

注:这里使用了last()和position()两个函数,xpath还支持更多的函数,结合这些函数可以获得非常强大的处理能力。

2)属性谓词

含有属性name的meta元素:

>>>doc.xpath('/html/head/meta[@name]')

,,,]

含有属性name而且其取值为robots的meta元素:

含有任意属性的meta元素:

>>>doc.xpath('/html/head/meta[@*]')

3)函数谓词

xpath内置很多函数,灵活使用这些函数,可以极大提升查找效率,比如:

-使用text()函数

>>>doc.xpath('//td[text()="2017-03-21"]')

-使用contains函数

>>>[td.textfortdindoc.xpath('//td[contains(text(),"2017-03-2")]')]

['2017-03-29','2017-03-28','2017-03-27','2017-03-24','2017-03-23','2017-03-22','2017-03-21','2017-03-20']

-使用starts-with函数

>>>[td.textfortdindoc.xpath('//td[starts-with(text(),"2017-02-2")]')]

['2017-02-28','2017-02-27','2017-02-24','2017-02-23','2017-02-22','2017-02-21','2017-02-20']

>>>[td.textfortdindoc.xpath('//td[text()>21.0andtext()<23.0]')]

['21.02']

>>>[td.textfortdindoc.xpath('//td[text()<-2.5ortext()>21.0]')]

['21.02','-2.64']

通配符

xpath也支持通配符"*",其中'*"可以匹配任何标签元素,"@*"可以匹配任何元素属性,node()可以匹配任何节点:

>>>head.xpath('./*')

,,,,,,,,,]

>>>head.xpath('./meta[@*]')

>>>head.xpath('./node()')


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/6102205.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存