美文网首页我爱编程爬虫专辑
三、用Css来提取网页

三、用Css来提取网页

作者: 阿轲666 | 来源:发表于2017-06-06 09:56 被阅读0次

    scrapy提供了两种提取方法,Xpath和Css。

    Xpath用起来觉得好麻烦,有点笨,我还是比较喜欢Css的提取方式。因为CSS定位语法比Xpath简洁,定位方式更灵活多样,可以使用#id来根据ID获取元素,以及使用.class来根据class获取元素.用XPath实现的话都不会那么简洁,反过来呢,XPath可以使用,来返回到DOM树的上层节点中。anyway先操练起来!

    http://blog.jobbole.com/102337/


    F12来打开网页源代码,也可以点击firefox旁边那个小蜜蜂🐝

    我现在想提取“我想对所有新手程序员说些肺腑之言”

    关键词:entry-header;    h1

    我们现在用mac终端来测试一下提取结果,进入虚拟环境

    输入:

    scrapy shellhttp://blog.jobbole.com/102337/

    1.提取title

    >>> response.css(".entry-header h1::text").extract()[0]

    '我想对所有新手程序员说些肺腑之言'

    解释一下:

    这个点.  表示 选择所有class包含container的节点

    extract()提取出他的值

    [0]

    ::text伪类选择器

    这里要用py3,编码才是Unicode中文字,不然py2的话,还是utf8字符串的显示模式。

    2.提取日期

    >>> response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip()

    '2017/05/27 ·'

    3、提取点赞数

    >>> response.css(".vote-post-up  h10::text").extract()[0]

    '3'

    4、提取收藏数

    >>> response.css(".bookmark-btn::text").extract()[0]

    ' 7 收藏'

    用正则表达式把7提取出来

    进入python环境,测试一下正则表达式

    是骡子是马拉出来溜溜,不行慢慢调试

    importre

    match_re=re.match(".*?(\d+).*"," 7 收藏")

    ifmatch_re:

    print(match_re.group(1))

    yeah!7出来了

    5、提取评论数

    我用了比较笨的方法提取的:

    >>> response.css(".btn-bluet-bigger::text").extract()

    [' ', ' 赞', ' 7 收藏', ' 3 评论']

    >>> response.css(".btn-bluet-bigger::text").extract()[3]

    ' 3 评论'

    >>> response.css(".btn-bluet-bigger::text").extract()[3].strip()

    '3 评论'

    Bobby老师是这么做的,

    response.css("a[href='#article-comment'] span::text").extract()[0]

    走神中:

    自己做个小练习:

    把博士帽那个240声望值提取一下。

    >>> response.css("#author-bio .author-bio-info-block a::text").extract()[2].strip()

    '240'

    哎,还是我的笨方法好用,先这样吧,以后慢慢优化吧

    6.提取内容

    >>> response.css ( ".entry" ).extract()[0]或者

    >>> response.css ( "div.entry" ).extract()[0]

    都可以

    7、提取tag标签

    >>> response.css(".entry-meta-hide-on-mobile a::text").extract()

    ['开发', ' 3 评论 ', '程序员']

    如何把3评论给扔掉呢?

    用数组的方式在python里面简单写段代码来验证一下

    tag_list= ['开发',' 3 评论 ','程序员']

    tag_list= [elementforelementintag_listif notelement.strip ().endswith ("评论")]

    tags =",".join (tag_list)

    print(tag_list)

    Xpath基本语法

    举例元素标签为artical标签

    一:

    artical 选取所有artical元素的子节点

    /artical 选取根元素artical

    artical/a 选取所有属于artical的子元素a元素

    //div    选取所有div 子元素,无论div在任何地方

    artical//div  选取所有属于artical的div 元素,无论div元素在artical的任何位置

    //@class 选取所有名为class 的属性的

    二:谓语

    /artical/div[1]   选取所有属于artical 子元素的第一个div元素

    /artical/div[last()]  选取所有属于artical子元素的最后一个元素

    /artical/div[last()-1] 选取所有属于artical子元素的倒数低2个元素

    //div[@lang]   选取所有拥有属性为lang的元素

    //div[@lang="eng"] 选取所有div下lang属性为eng的元素

    三:

    /div/* 选取所有属于div元素的所有子节点

    //*    选取所有元素

    //div[@*]   选取所有带属性的title元素

    //div/a|//div/p   选取所有div元素的a和p 元素

    //span | //ul   选取文档中所有span和ul 的元素

    artical/div/pl|//span  选取所有div下的pl和文档中所有span

    注意事项:

    1) 按照审查元素的写法不一定正确,要按照网页源码的才行

    因为不一样,网页源码才是你看到的

    2) 浏览器有自带的复制xpath功能,firefox下载firebug插件

    3) xpath有c的速度,所以按照[@class=""]准确性较高

    CCS选择器语法

    *                  选择所有节点

    #container         选择id为container的节点

    .container      选择所有class包含container的节点

    li a            选取所有li 下所有a节点

    ul + p          选取ul后面的第一个p元素

    div#container > ul 选取id为container的div的第一个ul子元素

    ul ~p             选取与ul相邻的所有p元素

    a[title]        选取所有有title属性的a元素

    a[href="http://jobbole.com"]  选取所有href属性为http://jobbole.com的a元素

    a[href*="jobbole"]     选取所有href属性值中包含jobbole的a元素

    a[href^="http"]    选取所有href属性值中以http开头的a元素

    a[href$=".jpg"]    选取所有href属性值中以.jpg结尾的a元素

    input[type=radio]:checked   选择选中的radio的元素

    div:not(#container)  选取所有id为非container 的div属性

    li:nth-child(3)      选取第三个li元素

    li:nth-child(2n)      选取第偶数个li元素

    相关文章

      网友评论

        本文标题:三、用Css来提取网页

        本文链接:https://www.haomeiwen.com/subject/uilgfxtx.html