美文网首页Python爬虫爬虫专题python爬虫日记本
python爬虫回顾<五>:利用XPath爬取指定网

python爬虫回顾<五>:利用XPath爬取指定网

作者: TimLee1996 | 来源:发表于2017-02-23 15:50 被阅读3596次

在爬取了政府工作报告以后,一项新的任务又出现了,我们需要人民日报社论的标题以及社论文章进行分析。
与上几次不同的是这次我们运用的方法是XPath加DOM树的方式。这种方法我更倾向于是面向特征的查找方法,如果网页页面不是杂乱无章而是以一种规范地形式制作的话,用这种方法比正则表达式简单得多。
这种方法对于爬虫来说更主要的是解析方式的改变。

请求

请求的方式和原本没有两样

        # 社论地址 绑定
        edit_url = 'http://opinion.people.com.cn/GB/8213/49160/49179/index.html'
        # 打开网站 并将源码转化为DOM树
        edit_web = urllib2.urlopen(edit_url).read()

解析

制作DOM树

lxml是python中处理xml的一个非常强大的库,可以非常方便的解析和生成xml文件。
lxml.etree(html)可以将网页变成DOM树,每一个标签就变成了一个节点,子标签就相应变成子节点。

1487835109545.jpg
selector = etree.HTML(edit_web)

XPath

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
比如说我要获取网页的标题,那么我们可以用/html/head/title/ 一个节点的一个节点的遍历
最后text()把文本内容获取出来。
我更多地是把XPath想象成为一把剪刀,也就是说用XPath筛选的过程其实也就是剪枝的过程,剪掉那些符合我需要的数据的枝叶给保存下来。

# 在树中抓取所有符合条件的标题信息以及URL信息 (返回的也是一个树)
title_content = selector.xpath('//*[@class = "t10l14bl"]/a[@href]')
# 抓取的URL信息都是相对地址 在打开时需要补全
url_content = selector.xpath('//*[@class = "t10l14bl"]/a')

存储

存储方法我采用的是保存到列表中

# 分别遍历两个树 将所有的信息分别存入到列表中
edit_list = list([line.text[7:] for line in title_content])
url_list = list([line.get('href')for line in url_content])
# 列表的值一一对应 两两值再组成一个列表
title_url_list = zip(edit_list, url_list)

相关文章

网友评论

  • 片片星:请教个问题:(python3)
    import requests
    from lxml import etree
    html = requests.get('https://www.zhipin.com/c101010100/h_101010100/?query=%E6%95%B0%E6%8D%AE%E8%BF%90%E8%90%A5&page=4&ka=page-4')
    selector = etree.HTML(html.text)
    content_field = selector.xpath('//*[@id="main"]/div[3]/div[2]/ul/li[1]/a')

    for each in content_field:
    gongzi = each.xpath('//div[@class="job-primary"]/div[1]/h3/span/text()')
    gongsi = each.xpath('//div[@class="job-primary"]/div[2]/div/p/@name')
    print(gongsi)

    print出的属于list类型但却没有可读文本,请问是编码问题吗,怎么解决比较好
    片片星:谢谢,已关注,期待雄文。问题已经解决了,其实改成gongsi = each.xpath('//div[@class="job-primary"]/div[2]/div/p/@name/text()')就可以了。以前用BeautifulSoup的select选取,混了。
    另外敢问楼主把字典以键、值形式循环写入csv怎么操作?
    TimLee1996:不好意思 刚刚才看到
    你设个断点 或者直接print 看看HTML里面的数据
    我觉得你要获取的数据就没有加载出来
    现在的网站都是动态加载内容的 所以都是首先发给你一个框架 就是选择各种需要选择标签(地点
    职位 之类的)
    而内容是 后续通过请求的方式得到的json格式 然后再加载进去的。
    这个东西我最近爬取微博的时候有遇到 最近会更新类似的内容 有兴趣可以关注下哈
  • 叫我靓仔:学习了

本文标题:python爬虫回顾<五>:利用XPath爬取指定网

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