Python xpath无法返回列表结果,但第一个

时间:2017-01-11 07:59:18

标签: python xpath

我正在使用python ElementTree从网站上抓取数据,从它可以运行的控制台:

Python 2.7.5 (default, Aug 29 2016, 10:12:21)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2
>>> from lxml import etree
>>> import cookielib
>>> cj = cookielib.CookieJar()
>>> opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
>>> request = urllib2.Request("http://www.bbc.com/news/world-asia-38551931")
>>> data = opener.open(request, timeout=4)
>>> html = data.read()
>>> tree = etree.HTML(html)
>>> r = tree.xpath("//*[@class='image-and-copyright-container']/img")
>>> r
[<Element img at 0xc6ffa0>, <Element img at 0xc7a050>, <Element img at 0xc7a0a0>, <Element img at 0xc7a0f0>, <Element img at 0xc7a140>, <Element img at 0xc7a190>, <Element img at 0xc7a1e0>, <Element img at 0xc7a230>, <Element img at 0xc7a280>]

但是当在python脚本中执行时,它只会返回第一个元素:

#coding:utf-8
import urlparse
import re
import sys
import cookielib
import urllib2
from lxml import etree

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
request = urllib2.Request("http://www.bbc.com/news/world-asia-china-38551841")
data = opener.open(request, timeout=4)
html = data.read()
tree = etree.HTML(html)

results = tree.xpath("//span[@class='image-and-copyright-container']/img")

for result in results:
    print "##### src:" + str(result)

执行结果:

[user@site]$ python test.py
##### src:<Element img at 0x256c230>

代码中是否有任何错误或缺少处理?请帮忙,谢谢!

2 个答案:

答案 0 :(得分:0)

予。看看你的xpath表达式。

  1. "//*[@class='image-and-copyright-container']/img"

  2. "//span[@class='image-and-copyright-container']/img"

  3. 他们是不同的。

    II。网址也不同。

    我使用了相同的网址,你们两个代码(即使是不同的xpath)都会得到相同的结果。

答案 1 :(得分:0)

您的代码按预期工作。问题是,http://www.bbc.com/news/world-asia-38551931的初始HTML页面来源已包含所有必需的图片(/span/img元素),而http://www.bbc.com/news/world-asia-china-38551841的初始HTML页面来源只有一张图片和其他2个元素似乎是动态创建的。

您可以使用以下方案检查此信息:

  • 打开浏览器(例如Firefox
  • 点击F12
  • 在已打开的开发人员工具中切换到NetNetwork)标签
  • 然后转到HTML子标签
  • 导航至http://www.bbc.com/news/world-asia-china-38551841(如果您已经获得此URL,则重新加载页面)
  • 点击第一个GET请求并切换到Response标签
  • 使用CTRL + F查找与image-and-copyright-container
  • 匹配的条目

正如您所看到的,只有一个<span class="image-and-copyright-container">带有<img>孩子

要获取HTML所有已经“附加”的图片,您可以使用Selenium模块,如下所示:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.bbc.com/news/world-asia-china-38551841")
html = driver.page_source

注意使用selenium可能会降低脚本完成速度