V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
agenge
V2EX  ›  Python

scrapy 如何提取这样的动态标签内容?

  •  
  •   agenge · 2015-09-06 13:17:06 +08:00 · 2702 次点击
    这是一个创建于 3161 天前的主题,其中的信息可能已经有所发展或是发生改变。

    运行环境:

    OS : CentOS 6 64 位

    Scrapy 1.0.3

    Python 2.7.4

    需求:

    http://ip/a.html

    <div class="a">
    <ul>
    <li>
    <strong>属性 1</strong>
    内容 1
    </li>
    <li>
    <strong>属性 2</strong>
    内容 2
    </li>
    <li>
    <strong>属性 3</strong>
    内容 3
    </li>
    ...
    <ul>
    </div>

    文件 2 : http://ip/b.html:

    <div class="a">
    <ul>
    <li>
    <strong>属性 1</strong>
    内容 1
    </li>
    <li>
    <strong>属性 3</strong>
    内容 3
    </li>
    <li>
    <strong>属性 4</strong>
    内容 3
    </li>
    <li>
    <strong>属性 5</strong>
    内容 3
    </li>
    ...
    <ul>
    </div>

    '//div[@class="a"]/ul/li[1]/text ()' # 提取第一个 li

    '//div[@class="a"]/ul/li[2]/text ()' # 提取第二个 li

    每一个属性的内容将会赋值给对应的变量,例如属性 1 就赋值给 var1 ,属性 2 就赋值给 var2 , var1 和 var2 最终会写入 DB 。

    此处最关键的问题在于 某些页面的第二个<li>并不一定就是属性 2 ,有可能是属性 3 ,这样就会造成提取到的第二个<li>会赋值给 var3 (在属性 2 不存在的情况下),甚至是 var4 (在属性 1 属性 2 都不存在的情况下)。

    请问各位爬虫牛人,有什么办法能解决这个问题? 感谢。

    6 条回复    2015-09-06 17:45:48 +08:00
    Shared
        1
    Shared  
       2015-09-06 13:39:47 +08:00
    用顺序确定变量肯定不靠谱的,你可以换个思路,想想用别的属性、内容来确定变量
    ooh
        2
    ooh  
       2015-09-06 13:59:35 +08:00
    通过搜索关键字来确定属性是属于第几个,如果这个没法实现,教你一个 100%有效的方法,那就是人眼识别.
    agenge
        3
    agenge  
    OP
       2015-09-06 14:20:27 +08:00
    @Shared 感谢回复。

    想过一个办法,即每次判断 <strong>属性 4</strong> ,如果等于 属性 4 ,即赋值给对应的变量。否则继续判断是否等于属于 5 、等于属于 6 ,不过这样效率非常低,有几十个类似的属性。
    agenge
        4
    agenge  
    OP
       2015-09-06 14:21:51 +08:00
    @ooh 感谢回复。

    这个办法估计不可行,数据库中的字段已经确定属性列的排序了。
    shoaly
        5
    shoaly  
       2015-09-06 15:00:49 +08:00
    换成 pyquery 然后就可以很 happy 的 $(".a li strong") 了
    wlsnx
        6
    wlsnx  
       2015-09-06 17:45:48 +08:00
    你是怎么判断它有没有属性 1 的?把这个过程写成程序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2303 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:14 · PVG 16:14 · LAX 01:14 · JFK 04:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.