解析库的使用等价于在HTML中查找需要的信息时时使用正则,能够更加快捷地定位到具体的元素获取相应的信息。这里主要简单地介绍XPath,Beautiful Soup的用法,纵向学习对比两种库的用法。
from lxml import etree
from bs4 import BeautifulSoup
- 将文本/文件/URL转为对应的类型以获取数据
lxml可以读字符串和文件格式的html文档并且自动补全关闭标签,生成 lxml.etree._Element 数据类型可以用于XPath解析
b=etree.HTML(a)#字符串变量转为etree的数据类型
b=etree.parse(filename,etree.HTMLParser())#HTML文件转为etree的数据类型
BeatifulSoup直接读取字符串(可修正HTML文本),生成 bs4.BeautifulSoup 类的一个对象
c=BeautifulSoup(a,'lxml')#依赖于第三方解析器,这里选取lxml作为其解析器
- 获取标签,属性,内容
XPath
xpath使用 //标签 获取所有该标签节点 /标签 获取所有直接子节点,//标签[1] 选取所有该标签中的第一个(下标从1开始,使用较多);
获取属性时直接使用在该标签后加 /@class 对应属性名称即可,注意此时返回为列表形式;通过属性值筛选标签时需 /ul[@href="..."] 这种方式获取,若某些属性含多值时可用 [contains(@属性名,“value”)];多属性筛选时可加 and or等运算符;
获取标签中的内容时 /text(),同样以列表形式返回。若此时该标签内仍有子标签则会以列表形式返回子标签前的文本,若需获取的文本在子标签内则通过 / 继续取标签的子标签然后 /text()
BeautifulSoup
获取标签可使用 bs.ul 直接 .标签名称,返回数据类型为 bs4.element.Tag 且只返回符合条件的第一个标签,返回一个Tag对象;使用 find_all() 查找符合条件元素,参数分别为name='标签名称',attrs={'属性名':'value'},或者 属性名='value' ,注意这种方式时 find_all(class_='value'),类名属性较为特殊,text='value'或者正则表达式,以上参数设置可选定特定条件的标签,返回Tag对象组成的列表;使用 select("") 中的参数与CSS选择器方式类似,例如,select('.classname'),返回列表;
获取属性直接在获取的标签对象后加 ['属性名'] 或者 ul.attrs['属性名'];
获取文本时直接使用 .string 即可返回文本 - 另外,以上两种解析器标签选择后由于返回对象均和选择之前数据类型相同,所以仍可用选择前的所有方式继续选择子标签内容。