【问题标题】:python BeautifulSoup strange behaviour [duplicate]python BeautifulSoup的奇怪行为[重复]
【发布时间】:2016-07-03 21:44:30
【问题描述】:

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

创建更好的表格输出的简单方法也是不错的。

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生成的
  • 好的 - 这解释了这个问题。关于如何阅读表格有什么建议吗?
  • 我认为标准的解决方案是使用 Selenium、phantomJS、Ghostery 或其他一些 javascript 引擎或“机器人浏览器”。我对它们中的任何一个都不太了解,但只是不断听到这三个被描述为抓取 JS 内容的直接解决方案。但更好的是,也许您可​​以直接访问该站点的 API。如果幸运的话,它会返回格式良好的 json 或 xml
  • @robvoi 是的,你很幸运。 API 返回jsonp data :)

标签: python


【解决方案1】:

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

import requests
import json

url = "http://index.chineseshipping.com.cn/servlet/ccfiGetContrast?SpecifiedDate=&jc="
jsonp = requests.get(url)
table_data = json.loads(jsonp.text.encode("utf-8").split("(")[1].split(")")[0])

# SCRAPE RESPONSIBLY. WE DON'T WANT TO DDOS SOME POOR WEBSITE

【讨论】:

  • 这行得通。非常感谢!
【解决方案2】:

不工作的网页使用了 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')

【讨论】:

  • 这行得通。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-01-28
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多