爬取豆瓣电影Top250,一个问题

之前是用正则写的,虽然成功爬取了,但是要考虑的特殊情况太多,很烦。后来有人建议用xpath,所以学习了相关知识,改写原先用正则写的代码,但是碰到了一个问题
网页的源代码如下:

                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
                            1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                        </p>

                        
                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.6</span>
                                <span property="v:best" content="10.0"></span>
                                <span>987073人评价</span>
                        </div>

                            <p class="quote">
                                <span class="inq">希望让人自由。</span>
                            </p>
                    </div>

我现在想提取导演演员那块的信息,根据所在位置我的代码如下(导演存在dirc中)):

selc = etree.HTML(html)
infos = selc.xpath('//div[@class="info"]')
for a in infos:
    dirc = a.xpath('div[@class="bd]/p[@class=""]/text()')

但这样写不对,网上的代码如下:

info = i.xpath('div[@class="bd"]/p[1]/text()') 

我这样写和网上的不是一样吗?为什么我的不对?求高手指点,谢谢

阅读 2.9k
3 个回答
import requests
from lxml import etree


start_url = "https://movie.douban.com/top250?start="

htmlStr = requests.get(start_url).text

tree = etree.HTML(htmlStr)

infos = tree.xpath('//ol[@class="grid_view"]/li//div[@class="bd"]/p[1]')

for i in infos:
    print(i.xpath('.//text()'))

试试在chrome里装个XPath Helper插件,在这里面边写可以边看到匹配出来的内容,这样就知道自己写到哪个位置出问题了。

网上的这种方式更加合理,
info = i.xpath('div[@class="bd"]/p[1]/text()')
另外你的这种方式:

selc = etree.HTML(html)
infos = selc.xpath('//div[@class="info"]')
for a in infos:
    dirc = a.xpath('./div[@class="bd]/p[@class=""]/text()')  # 这样是否可行

但是我还是觉得dirc = a.xpath('./div[@class="bd]/p[1]/text()')更好

div[@class="bd"]/p[1]是选取class为bd的div孩子节点的第一个p节点

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题