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

2015-09-06 13:17:06 +08:00
 agenge
运行环境:

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 都不存在的情况下)。


请问各位爬虫牛人,有什么办法能解决这个问题? 感谢。
2720 次点击
所在节点    Python
6 条回复
Shared
2015-09-06 13:39:47 +08:00
用顺序确定变量肯定不靠谱的,你可以换个思路,想想用别的属性、内容来确定变量
ooh
2015-09-06 13:59:35 +08:00
通过搜索关键字来确定属性是属于第几个,如果这个没法实现,教你一个 100%有效的方法,那就是人眼识别.
agenge
2015-09-06 14:20:27 +08:00
@Shared 感谢回复。

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

这个办法估计不可行,数据库中的字段已经确定属性列的排序了。
shoaly
2015-09-06 15:00:49 +08:00
换成 pyquery 然后就可以很 happy 的 $(".a li strong") 了
wlsnx
2015-09-06 17:45:48 +08:00
你是怎么判断它有没有属性 1 的?把这个过程写成程序。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/218571

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX