以编程方式打开网页会产生意外结果

时间:2012-06-19 19:37:37

标签: python html ruby nokogiri urllib2

我正在尝试从此网站获取信息:

http://www.gocrimson.com/sports/mbkb/2011-12/roster

如果你在浏览器中查看该页面,你会看到一个包含所有玩家信息的好<table>,其下方有教练的信息。

当我将该页面拉入python程序(使用urllib2)或ruby程序(使用nokogiri)时,该表被表示为一堆div元素。我以为可能有一些javascript正在运行,所以我在浏览器上禁用了javascript并重新访问了该页面。它仍然会加载table

如果我使用Selenium来提取页面来源,我会获得table格式。

有关为什么页面会出现div的想法吗?

的Python:

page = urllib2.urlopen(url)
html = page.read()

print html输出(我将div中的一个放在最后一行以引起对它的注意。这是浏览器页面中的tr。缩短为保持在字符限制之下):

'\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\r\n\r\n\r\n<?xml version="1.0" encoding="iso-8859-1"?>\r\n<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">\r\n<html xmlns="http://www.w3.org/1999/xhtml">
<head> 
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1"/> <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0"/>\r\n<meta forua="true" http-equiv="Cache-Control" content="must-revalidate" />\r\n<meta http-equiv="Pragma" content="no-cache, must-revalidate" />\r\n        
<title>The Official Website of Harvard University Athletics:  Harvard Athletics - GoCrimson.com  : Men\'s Basketball - 2011-12 Roster </title>\r\n<link rel="stylesheet" href="/info/mobile/mobile.css" type="text/css"></link>\r\n<link rel="stylesheet" href="/mobile-overwrite.css" type="text/css"></link>\r\n</head>\r\n
<body class="classic">\r\n\r\n\r\n\t<strong><a href="/landing/index">News</a></strong>\r\n | \r\n\t<a href="/landing/index?c=scores">Scores</a>\r\n<br /><br />\r\n\r\n<p class="goBack-link"><a href="javascript:history.go(-1)"><<< Back</a></p>\r\n\r\n\r\n<div class="roster ">\r\n\t\t\t<div class="title">Men\'s Basketball - 2011-12 Roster</div>\r\n\t\t<div class="table">\r\n\t\t<div class="titles">\r\n\t\t\t
<div class="number">No.</div>\r\n\t\t\t<div class="name">Name</div>\r\n\t\t\t<div class="positions">Position</div>\r\n\t\t</div>\r\n\t\t\r\n\t\t\t\t\t<div class="item  even  clearfix">\r\n\t\t\t\t<div class="data">\r\n\t\t\t\t\t<div class="number">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t3\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="name">

红宝石:

doc = Nokogiri::HTML(open("http://www.google.com/search?q=doughnuts"))
doc.css('tr').each do |node|
  puts node.text
end

找不到tr,但

doc.css('div').each do |node|
  puts node.text
end

找到div s

1 个答案:

答案 0 :(得分:1)

通过添加User-Agent标头,我可以获得<table>而不是div。具体来说,我假装是一个众所周知的流行浏览器。

opener = urllib2.build_opener()
opener.addheaders = [('User-agent',
    ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) '
     'AppleWebKit/535.1 (KHTML, like Gecko) '
     'Chrome/13.0.782.13 Safari/535.1'))
]
response = opener.open('http://www.gocrimson.com/sports/mbkb/2011-12/roster')
print response.readlines() # divs are now a table