python web抓码错误

时间:2014-02-22 16:03:25

标签: python beautifulsoup

我正在尝试使用美丽的汤学习python中的网页抓取的基础知识。我在文档中遇到了代码。当我执行它时出错。代码是:

import urllib2
from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(urllib2.urlopen('http://www.bcsfootball.org’).read())

for row in soup('table', {'class': 'mod-data’})[0].tbody('tr'):
  tds = row('td')
  print tds[0].string, tds[1].string

,错误是:

SyntaxError: Non-ASCII character '\xe2' in file ex.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

请帮我解决这个问题,并解释一下

for row in soup('table', {'class': 'mod-data’})[0].tbody('tr'):

大多数网站都提供示例代码,而不是解释它是如何产生的以及它是什么意思。它有点令人困惑,像classtbody等术语。如果您可以推荐任何网站或电子书或任何其他内容,那将非常有用

3 个答案:

答案 0 :(得分:3)

你在这一行有一个错字:

soup = BeautifulSoup(urllib2.urlopen('http://www.bcsfootball.org’).read())
<。>而不是.org之后的单引号你有一个撇号

应该是这样的:

soup = BeautifulSoup(urllib2.urlopen("http://www.bcsfootball.org").read())

同时

您在以下行中遇到同样的问题。在 mod-data 之后将撇号更改为引用

而不仅仅是soup('table', {'class': 'mod-data'})[0].tbody('tr') # syntax error

尝试soup.find_all('table', {'class': 'mod-data'})[0].tbody('tr')

对于旧版本的BeautifulSoup,

.findAll ..

你应该在这里使用一种方法,比如.find_all()返回一个列表

阅读BeautifulSoup docs并获取BeautifulSoup的最新版本(4)

以下代码适用于我:

import urllib2
from bs4 import BeautifulSoup # latest version bs4

soup = BeautifulSoup(urllib2.urlopen("http://www.bcsfootball.org").read())

for row in soup.find_all("table", {"class": "mod-data"})[0].tbody("tr"):
    tds = row("td")
    print tds[0].string, tds[1].string

<强>输出:

1 Florida State
2 Auburn
3 Alabama
4 Michigan State
5 Stanford
6 Baylor
7 Ohio State
8 Missouri
9 South Carolina
10 Oregon
11 Oklahoma
12 Clemson
13 Oklahoma State
14 Arizona State
15 UCF
16 LSU
17 UCLA
18 Louisville
19 Wisconsin
20 Fresno State
21 Texas A&M;
22 Georgia
23 Northern Illinois
24 Duke
25 USC

如果您在这些行上使用单引号时遇到问题,请使用双引号。

答案 1 :(得分:1)

尝试更改第四行:

soup = BeautifulSoup(urllib2.urlopen('http://www.bcsfootball.org’).read())

要:

soup = BeautifulSoup(urllib2.urlopen("http://www.bcsfootball.org").read())

看起来您的第二个单引号与第一个单引号不同,因此更改为双引号可以缓解该错误。

您要问的代码是从表中读取。在HTML中,表的每一行都由标记表示,您的程序正在搜索该标记然后从中读取。然后,您将打印找到的表的第一列和第二列。

答案 2 :(得分:0)

尝试更改第二行:

来自bs4 import BeautifulSoup