1.lxml(转自简书)
from lxml import etree
2 import requests
3
4
5 url = " "
6 html = requests.get(url)
7 selector = etree.HTML(html.text)
8 content_field = selector.xpath('//div[@class="lesson-list"]/ul/li')
9 print(content_field)
Element是XML处理的核心类,Element对象可以直观的理解为XML的节点,大部分XML节点的处理都是围绕该类进行的。这部分包括三个内容:节点的操作、节点属性的操作、节点内文本的操作。
1节点操作
1创建节点
root = etree.Element("root")
2获取节点名称
print(root.tag)
3输出xml内容
print(root.tostring)
...
2属性操作
1创建属性
可以在创建Element对象时同步创建属性,第二个参数即为属性名和属性值:
root = etree.Element('root', interesting='totally')
root.set('hello', 'Huhu')
2获取属性
属性是以key-value的方式存储的,就像字典一样
print(root.get("interesting")
>>>totally
print(root.keys())
>>>["interesting","hello"]
3文本操作
print(root.text)
...
文件解析
文件解析常用的有fromstring、XML和HTML三个方法。接受的参数都是字符串。
>>> xml_data = '<root>data</root>' # fromstring方法
>>> root1 = etree.fromstring(xml_data)
>>> print(root1.tag)
root
>>> print(etree.tostring(root1))
b'<root>data</root>' # XML方法,与fromstring方法基本一样
>>> root2 = etree.XML(xml_data)
>>> print(root2.tag)
root
>>> print(etree.tostring(root2))
b'<root>data</root>' # HTML方法,如果没有<html>和<body>标签,会自动补上
>>> root3 = etree.HTML(xml_data)
>>> print(root3.tag)
html
>>> print(etree.tostring(root3))
b'<html><body><root>data</root></body></html>'
2.CSS和xpath
目标 | CSS | XPath |
---|---|---|
所有元素 | * | //* |
所有的P元素 | p | //p |
所有的p元素的子元素 | p * | //p/* |
根据ID获取元素 | #foo | //*[@id='foo'] |
根据Class获取元素 | .foo | //*[contains(@class,'foo')] 1 |
拥有某个属性的元素 | [title] | //*[@title] |
所有P元素的第一个子元素 | p > *:first-child | //p/*[0] |
所有拥有子元素a的P元素 |
无法实现 | //p[a] |
下一个兄弟元素 | p + * | //p/following-sibling::*[0] |
css 选择器:
li a 选取所有li下的所有a节点
li:nth-child(3)选取第三个li元素(从1开始)
xpath:
//p[1]