scrapy 解析文档

来源:互联网 发布:插画培训班 知乎 编辑:程序博客网 时间:2024/06/07 07:07

示例

scrapy类的实现位于scrapy.selector 模块

from scrapy.selector import Seletorseletor=Seletor(response=response)seletor_list=seletor.xpath("//h1")  #选中文档中所有的h1for sel in seletor_list:    print sel.xpath('./text()')selector.xpath('.//ul').css('li').xpath('./text()')

具体的可以参考github源代码:https://github.com/wu-yy/scrapy_origin

提取数据的函数

调用Seletor或者SeletorList对象的以下方法:
extract()
re()
extract_first() seletorList 专有
re_first() selectorList 专有

sl=selector.xpath(.//li/text())sl[0].extract()  # 返回第一个数据sl.extract()    #返回所有数据的数组sl.extract_first()   #返回第一个数据

有些时候需要用正则表达式提取选中内容的某部分,可以使用re方法。

text='。。。省略内容'selector=Seletor(text=text)selector.xpath('.//li/b/text()').re('\d+\.\d+') #只提取数字部分

Response 内置Selector对象

可以直接使用 response.xpath() 或者response.css()

response.xpath('.//h1/text()').extract()或者respnse.css(li::text).extract()

xpath

Xpath 是XML路径语言,它是确定xml文档中某部分位置的语言。
xml文档,html属于xml。

表达式 描述 / 选中文档的根 (root) . 选中的当前节点 .. 选中当前节点的父亲节点 ELEMENT 选中子节点中所有的ELEMENT元素的节点 //ELEMENT 选中后代节点中所有的ELEMENT元素的节点 ,无论在文档或后代的什么位置 比如 xpath(//a)和xpath(/html/body//img) * 选中所有元素的节点 text() 选中所有的文本节点 @ATTR 选中名字为ATTR属性的节点 @* 选中所有属性的节点 [谓语] 谓语用来查找某阁特定节点或者包含某个特定值的节点

xpath 还提供了许多函数,如数字、字符串、时间、日期、统计等。
string 函数:返回字符串的一个整字符串

from scrapy.selector import Selectortext='<a href="#">Click here to go to the <strong> Next Page </strong></a>'sel=Selecor(text=text)sel.xpath(/html/body/a//text()).extract()#将得到两个子串['Click here to go to the','Next Page']sel.xpath('string(/html/body/a)')  #将得到一个整字符串 ['Click here to go to the Next Page']

contains(str1,str2) 判断str1 是否包含str2

sel.xpath('//p[contains(@class,"small")]')#选择class属性中包含“small”的p元素

更多的Xpath的详细内容可以看Xpath的文档 https://www.w3.org/TR/xpath

css选择器

css语法比Xpath简单一些,但不如xpath功能强大,实际上我们调用css方法时,python库的cssselect将css选择器转换为xPath表达式。
css的一些基本语法

表达式 描述 例子 * 选中所有元素 * E 选中E元素 p E1,E2 选中E1和E2元素 div, pre E1 E2 选中E1后代中的E2元素 div p E1 > E2 选中E1子元素中的E2元素 div > p E1+E2 选中E1元素兄弟元素中的E2元素 p+strong .CLASS 选中class属性中包含CLASS的元素 .info ID 选中id属性为ID的元素 main [ATTR] 选中包含ATTR属性的元素 [href] [ATTR=value] 选中属性ATTR等于value的元素 [method=post] [ATTR~=value] 选中ATTR属性包含value的元素 [class~=clearfix] E:nth-child(n) ,E:nth-last-child(n) 选中E元素,且该元素必须是父元素 的(倒数)第n个元素 a:nth-child(1),a:nth-last-child(2) E:first-child,E:last-child E元素,且必须是父元素的第一或或倒数第一个子元素 E:empty 选中没有子元素的E元素 div:empty E::text 选中E元素的文本节点 p::text

例如:

[ATTR] response.css('[style]')[ATTR=value] respnse.css('[id=myhome]')