关于页面信息定位,我习惯用的方法有三种,这三种方法基本能通吃
- css
- xpath
- re
推荐看一篇博客Python爬虫利器二之Beautiful Soup的用法
还可以去看Selectors官方文档
在定位同一个位置有多中解决方法,选择合适的才重要
xpath使用
假设有一段这样的html
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br />![](image1_thumb.jpg)</a>
<a href='image2.html'>Name: My image 2 <br />![](image2_thumb.jpg)</a>
<a href='image3.html'>Name: My image 3 <br />![](image3_thumb.jpg)</a>
<a href='image4.html'>Name: My image 4 <br />![](image4_thumb.jpg)</a>
<a href='image5.html'>Name: My image 5 <br />![](image5_thumb.jpg)</a>
</div>
</body>
</html>
xpath('//title/text()').extract()
[u'Example website']
xpath('//base/@href').extract()
[u'http://example.com/']
xpath('//a[contains(@href, "image")]/@href').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']
xpath('//a[contains(@href, "image")]/img/@src').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']
xpath('//header/h1[1][@class="article-title"]/a/text()').extract()
代码要点:
- text()
- extract()
- a[contains(@href, "image")]
- h1[@class="article-title"]
- @href和@src
在shell中使用
scrapy chell "www.baidu.com"
sel.xpath("使用上文中的xpath语法")
遇到的主要问题
- 标签没有闭合,用re去匹配吧
用bs4去找zhang这个标签,但是没有闭合的情况下,定位不到这个位置
<div>
<zhang>发布于 2017:05:07
<zhang>发布于 2017:05:07
</div>
- 标签无法定位,用re去匹配吧
即使闭合了,你发现没有id没有name没有class,也是很难定位的
<div>
<zhang>发布于 2017:05:07</zhang>
<zhang>发布于 2017:05:07</zhang>
</div>
针对定位问题,我会不断总结,将经验写进这个博客,持续更新中~~~