我正在使用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>
代码中是否有任何错误或缺少处理?请帮忙,谢谢!
答案 0 :(得分:0)
予。看看你的xpath表达式。
"//*[@class='image-and-copyright-container']/img"
"//span[@class='image-and-copyright-container']/img"
他们是不同的。
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
Net
(Network
)标签HTML
子标签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
可能会降低脚本完成速度