scrapy 选择器

时间:2022-03-26 10:08:36

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]