之前文章中使用lxml库进行html文件解析,获取视频源地址。
今天对涉及到的xpath定位方法及返回数据的处理方法简单和大家交流一下。
前文GetData方法中涉及的用法:

from lxml import etree
import requets
url = 'http://www.vdonghua.cn/info/61.html'
# 上面三行目的是为了保证代码的可执行性

# 下面为 GetData()方法中使用lxml库内容的部分
raw = requests.get(url).text
# 实例化etree.HTML()对象
parser = etree.HTML(raw)
# 根据xpath路径,获取符合条件的对象内容
texts = parser.xpath('/html/body/div[2]/div/div[1]/script/text()')

没有学过xpath,如何获取xpath路径呢?
在浏览器中,按F12调出开发者工具,然后Ctrl+Shift+C,选择指定的页面位置进行定位。在开发者工具中定位到具体的位置后,鼠标点击右键copy xpath即可。(因为v动画文章页中falsh区域使用了iframe,所以这里去了下面的script标签数据)
在这里插入图片描述获取的路径是“/html/body/div[2]/div/div[1]/script”,和我们用到的不一样?我们的目标是路径下的文本内容,所以可以在xpath路径中加上==“/text()”==。
同样的如果要获得script标签下的type属性值,可以在路径下添加上“/@type”。如何使用xpath进行定位,大家可以用一个小时左右的时间去突击一下。
不通的xpath返回与之对应的结果,不过所有的返回值都是列表。我们会对其中Element做进一步的了解。

# 接上面的代码
# print语句,# 后面为 打印出的结果

data = htmlEmt.xpath('/html/body/div[2]/div/div[1]/script')
print data # [<Element script at 0xb454ec8>]
print type(data) #<type 'list'>

data = htmlEmt.xpath("//div/script[@type='text/javascript']")
print data # [<Element script at 0xaf3fec8>]
print type(data) # <type 'list'>

data = htmlEmt.xpath('/html/body/div[2]/div/div[1]/script/text()')
print data # ['document.getElementById(\'video_iframe\').src="https://video.vdonghua.cn/player/833cd31f7d2641fabd788007f170daa8?r="+(new Date()).getTime();'] 返回字符串格式数据

data = htmlEmt.xpath('/html/body/div[2]/div/div[1]/script/@type')
print data # ['text/javascript']

下面我们继续聊列表返回值Element、Element返回值的属性,让我们尽快上手lxml解析html文件方法。

# 接上面代码

# 既然是list返回值,我们用for循环读取返回值内容
for i in data:
# Element类型数据可使用的属性
# 当然Element也有和_Attrib类型数据类似的方法,通过下面_Attrib方法、属性的介绍,就省略了
   print i.tag # script 标签名
   print i.text # document.getElementById('video_iframe').src="https://video.vdonghua.cn/player/833cd31f7d2641fabd788007f170daa8?r="+(new Date()).getTime(); 文本内容
   print i.attrib # {'type': 'text/javascript'} 标签中属性
   print type(i.attrib)  # <type 'lxml.etree._Attrib'> 返回的属性格式为_Attrib

   # 看一下_Attrib都有哪些用法
   for x in i.attrib :
      if x == 'type':
         # 通过属性的key获得对应的value
         print i.attrib.get(x) # text/javascript
         print i.attrib.get('type') # text/javascript

   # 属性名称的迭代传递
   for x in i.attrib.iterkeys():
      print x # type 属性的key
      print type(x) # <type 'str'>

   # 属性值的迭代传递
   for x in i.attrib.itervalues():
      print x # text/javascript 属性中的value
      print type(x) # <type 'str'>

   # 属性的迭代传递
   for x in i.attrib.iteritems():
      print x # ('type', 'text/javascript')
      print type(x) # <type 'tuple'>

希望你使用lxml解析html愉快!!!

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:1 个月前 )
c345bb45 5 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐