当前位置:   article > 正文

python爬虫,爬取猫眼电影2(xpath和bs4)_python访问猫眼电影网址无法定位到验证中心xpath

python访问猫眼电影网址无法定位到验证中心xpath

接着上面的。

使用xpath提取信息,虽然python很多库,比如beautifulsoup,也有很多功能,比如查找节点,添加删除节点。但是个人感觉对爬虫来说,最重要的还是提取信息,当然,顺利的提取信息的前提是你得掌握好这些库的用法,不过有些功能确实一辈子也不会用到。对爬虫来说,就是提取文本,获取属性,这两个。

还是打开页面,这里我直接读入本地的文件,知识为了简单起见。不在requests了。

我们自己做网页爬虫的时候,还是需要借助一些工具的。比如xpath。我经常用的就是 浏览器的xpath helper插件。可以很方便的看到xpath的路径是否匹配到文本。

  1. from lxml import etree
  2. e = etree.HTML(html)
  3. e.xpath("//title//text()")

具体到提取信息,还是需要借助浏览器插件。

 这样,就可以看到是不是能提取到信息,如果不能,那就就是xpath有问题了。可以再改,

当然也可以在element,元素上直接点击右键,copy xpath,但是这只是有助于我们分析,往往只能提取个别的,不能用到一个网页里面所有的电影。

 拷贝出来的xpath是这样的。

 结果它只能匹配《我不是药神》这一个电影名字。往往自己写,加上拷贝,一起分析。简单的xpath,直接就可以写出来,比如这个例子。复杂的可以借助拷贝,再分析。

演员的信息可以这样。

  1. e = etree.HTML(html)
  2. dd = e.xpath('//div[@class="main"]//dd')
  3. print(len(dd))
  4. for d in dd:
  5. index = d.xpath('.//i/text()')[0]
  6. img = d.xpath('.//a/img[2]/@data-src')[0]
  7. title = d.xpath('.//p[contains(@class,"name")]//text()')[0]
  8. actor = d.xpath('.//p[contains(@class,"star")]//text()')[0].strip()
  9. releasetime = d.xpath('.//p[contains(@class,"releasetime")]//text()')[0]
  10. score = d.xpath('.//p[contains(@class,"score")]//text()')
  11. score = "".join(score)
  12. print(index, img, title, actor, releasetime, score)

 这里我还是先把dd元素抓出来,然后再遍历。

dd元素里面的每一个元素也是xpath对象,还是继续用xpath提取信息。

为了省事,直接用的 contains方法, 其实也可以直接写 成 

//dd//p[@class="star"]//text()

这样的形式,但是我怕有的class里面的内容不止是一个单词,为了省事,还是用了contains安全一些。

得到结果。

 接下来用bs4

首先还是把html转成bs4对象。

  1. from bs4 import BeautifulSoup
  2. soup = BeautifulSoup(html, 'lxml')
  3. # print(soup)
  4. items = soup.find_all('dd')
  5. # print(len(dd))
  6. for item in items:
  7. index = item.i.string
  8. title = item.find(class_='name').string,
  9. img = item.find(class_='board-img')['data-src'],
  10. star = item.find(class_='star').string.strip()[3:],
  11. time = item.find(class_='releasetime').string.strip()[5:],
  12. score = item.find(class_='integer').string.strip() + item.find(class_='fraction').string.strip()
  13. print(index, img, title, actor, releasetime, score)

 然后是css

同样,还是读入为css对象,只不过bs4里面就可以直接用css。

比如:

  1. soup.select('dd:nth-child(1) .star')
  2. soup.select('dd i.board-index')[0]
  3. dd = soup.select('dd')
  4. dd
  5. for d in dd:
  6. print(d.select('.star'))
  7. soup.select("dd p.star")[0].get_text()
  8. soup.select("dd i.board-index")[0].get_text()
  9. soup.select("dd .score i")[0].string
  10. soup.select("dd:nth-child(1) .integer")[0].string

先把dd解析为soup对象,然后,用select方法,就可以了。

bs4提取信息的函数是get_text(),

或者string,两者结果是一样的。

css选择器,需要借助浏览器的chropath插件,

比如

我平时喜欢用scrapy的selector方法,里面支持xpath 和css,所以还是挺方便的,反正都要装scrapy。所以一个解决所有问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/372042?site
推荐阅读
相关标签
  

闽ICP备14008679号