作者aweimeow (喵喵喵喵 ヽ( ・∀・)ノ)
看板Python
标题Re: [问题] python汇入资料库问题
时间Wed Sep 7 15:56:42 2016
※ 引述《DankeTe (Aniz)》之铭言:
: 各位好 小弟在抓取网址及相关内容时发生了下列的错误,
: 有至网上先行GOOGLE,
: 但仍旧不得其解,希望能够帮帮小弟解惑。
: 此图为程式码
: http://imgur.com/a/Mhw3H
: 下图为错误
: http://imgur.com/a/MEvi5
: 程式码
: http://pastebin.com/NNucqisB
因为内容有点多,所以我就直接回应成一篇了,
我看了一下程式码认为你想做的事情是:
* 把网页的 最新消息 每一条的标题与连结都爬下来
* 存到资料库去
然後我的机器没有装 MySQL,所以就只有 debug 前面的部分 XD
Line 15:
train_table = soup.findAll('tr',{'class':'gray01 text_12_1pt form01'})
如果这样子写的话,会只有 match exact class,所以应该改成
train_table = soup.findAll('tr', ['gray01', 'text_12_1pt'])
Line 21:
[tag['href'] for tag in train_link.findAll('a',{'href':True})][0]
这里有几个问题,第一个是你的变数名称,在 Line 8 你宣告了 train_link,
但是这边 Line 20 也用了 train_link,所以 for loop 的 train_link 会变成字串
因此你要改用别的名字,例如说使用 tr 作为名称,
第二个问题是 [statement][0] 这种写法是没有意义的,在这个例子当中,
每一个 tr 里面只会有一个带有 href 属性的 a tag,所以只需要写成这样就可以
tr.findAll('a', {'href': True})[0]['href']
这一句的意思是,findAll 会回传 list,但是我们知道他只有一个所以取出第一个,
并且我只要他的 href 这个 key 的 value 就好了。
再来的小问题就是你的 Code 可以考虑参考 PEP8 等 Coding Style,
train_news_title.findAll('span',{'title':True})][0]
我会喜欢在 , 与 : 後方加一个空白:
train_news_title.findAll('span', {'title': True})][0]
可以参考 PEP8:E231 missing whitespace after ‘,’
Line 24:
for train_news_title in train_table:
因为这边和 Line 20 是一样的,所以我倾向於把他合并起来处理
Line 29-31:
if len(train_link) == len(train_news_title):
我看不太懂这段想要做甚麽,所以特别提出来讲,
如果你想要的是确定这两者之间数量会一致,可以使用 assert statement
assert len(train_link) == len(train_news_title)
这样子在两者数量不一致的时候就会跳出 AssertionError
Line 32:
for j in range(number1):
因为前述说明,所以我把 number1 拿掉了,这边可以用以下 code 来替代
for j in range(len(train_link)):
大概就是这样了,再次想提醒你可以参考 PEP8 的 Coding Style :)
改过的 Code:
http://pastebin.com/ggxm25zd
Demo:
http://i.imgur.com/5i82Fok.png
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.127.91.225
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1473235007.A.B4A.html
1F:推 ChanghuaOx: 不愧是meow大 <(_ _)> 09/11 14:43
2F:推 bottomless: 太神啦… 09/13 15:46