Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蟒蛇的奇怪行为_Python - Fatal编程技术网

Python 蟒蛇的奇怪行为

Python 蟒蛇的奇怪行为,python,Python,我使用下面的代码从网站上读取表格。 在第一个示例中,一切都按预期进行。 对于第二个示例(注释变量),我只得到第一列。我找不到原因。有人能帮忙吗 还有一种简单的方法可以创建更好的表输出 import urllib2 import pprint from bs4 import BeautifulSoup URL = 'http://www.proplanta.de/Markt-und-Preis/MATIF-Raps/' TABLENR = 36 #URL = 'http://www1.chin

我使用下面的代码从网站上读取表格。 在第一个示例中,一切都按预期进行。 对于第二个示例(注释变量),我只得到第一列。我找不到原因。有人能帮忙吗

还有一种简单的方法可以创建更好的表输出

import urllib2
import pprint
from bs4 import BeautifulSoup

URL = 'http://www.proplanta.de/Markt-und-Preis/MATIF-Raps/'
TABLENR = 36

#URL = 'http://www1.chineseshipping.com.cn/en/indices/ccfinew.jsp'
#TABLENR = 4

req = urllib2.Request(URL, headers={'User-Agent' : "My Browser"}) 
con = urllib2.urlopen( req )
html = con.read()
soup = BeautifulSoup(html)

tables = soup.find_all('table')

data = []

rows = tables[TABLENR].find_all('tr')
for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append([ele for ele in cols if ele]) # Get rid of empty values

pprint.pprint (data)

不工作的网页使用javaScript。JavaScript通过改变DOM(文档对象模型)来创建动态内容。浏览器接收数据,然后运行java脚本对其进行更改。(在您的情况下,表数据正在更改)。当您尝试使用urllib获取网页时,它会接收内容,但不会执行后者(在其上运行javaScript)。通过使用selenium,我们可以通过浏览器完成工作并读取完整的数据

import selenium
from bs4 import BeautifulSoup
webpage = selenium.webdriver.Firefox()
webpage.get('http://www1.chineseshipping.com.cn/en/indices/ccfinew.jsp')
html = webpage.page_source
soup = BeautifulSoup(html)
tables = soup.find_all('table')

不工作的网页使用javaScript。JavaScript通过改变DOM(文档对象模型)来创建动态内容。浏览器接收数据,然后运行java脚本对其进行更改。(在您的情况下,表数据正在更改)。当您尝试使用urllib获取网页时,它会接收内容,但不会执行后者(在其上运行javaScript)。通过使用selenium,我们可以通过浏览器完成工作并读取完整的数据

import selenium
from bs4 import BeautifulSoup
webpage = selenium.webdriver.Firefox()
webpage.get('http://www1.chineseshipping.com.cn/en/indices/ccfinew.jsp')
html = webpage.page_source
soup = BeautifulSoup(html)
tables = soup.find_all('table')

您可以改用API。更干净(即使我的代码可能不干净)


您可以改用API。更干净(即使我的代码可能不干净)


在第二个示例中(我没有检查第一个),其他列中的数据是由javascriptok生成的——这就解释了问题。我想标准的解决方案是使用Selenium、phantomJS、Ghostery或其他javascript引擎或“机器人浏览器”。我对其中任何一个都不太了解,但我一直听到这三个被描述为删除JS内容的直截了当的解决方案。但更好的是,也许你可以直接访问网站的API。如果幸运的话,它将返回格式良好的json或jsonxml@robvoi是的,你很幸运。API返回:)在第二个示例中(我没有检查第一个),其他列中的数据是由javascriptok生成的-这就解释了问题。我想标准的解决方案是使用Selenium、phantomJS、Ghostery或其他javascript引擎或“机器人浏览器”。我对其中任何一个都不太了解,但我一直听到这三个被描述为删除JS内容的直截了当的解决方案。但更好的是,也许你可以直接访问网站的API。如果幸运的话,它将返回格式良好的json或jsonxml@robvoi是的,你很幸运。API返回:)这是有效的。谢谢!这很有效。谢谢!这很有效。谢谢!这很有效。谢谢!