【问题标题】:python 2.x wikipedia parsingpython 2.x 维基百科解析
【发布时间】:2016-01-02 15:49:16
【问题描述】:

我有这个代码:

import urllib
from bs4 import BeautifulSoup

base_url='https://en.wikipedia.org'
start_url='https://en.wikipedia.org/wiki/Computer_programming'
outfile_name='Computer_programming.csv'
no_of_links=10

fp=open(outfile_name, 'wb')

def get_links(link):
    html = urllib.urlopen(link).read()
    soup = BeautifulSoup(html, "lxml")
    ret_list=soup.select('p a[href]')
    count=0
    ret=[]
    for tag in ret_list:
        link=tag['href']
        if link[0]=='/' and ':' not in link and link[:5]=='/wiki' and '#' not in link:
            ret.append(base_url+link)
            count=count+1
        if count==no_of_links:
            return ret

l1=get_links(start_url)
for link in l1:
    fp.write('%s;%s\n'%(start_url,link))

for link1 in l1:
    l2=get_links(link1)
    for link in l2:
        fp.write('%s;%s\n'%(link1,link))

    for link2 in l2:
        l3=get_links(link2)
        for link in l3:
            fp.write('%s;%s\n'%(link2,link))

fp.close()

将节点邻域保存在 csv 文件中。 但是当我尝试运行它时,我收到了这个错误:

for link in l3:

TypeError: 'NoneType' object is not iterable

当我尝试运行另一个 Wikipedia 链接(如 https://en.wikipedia.org/wiki/Technology)的代码时,我遇到了同样的错误。 它工作的唯一页面是:https://en.wikipedia.org/wiki/Computer_science。这是一个问题,因为我需要在更多网站上收集数据,而不仅仅是计算机科学网站。

谁能给我一个提示如何处理它??

非常感谢。

【问题讨论】:

  • 你应该逐行调试你的程序。似乎在函数 get_links 的某个时刻出现 count != no_of_links,所以函数返回 None。
  • 应该跳过空链接,而不是让程序停止,这是问题
  • 如果一个页面上的链接少于 10 个怎么办?尝试在函数末尾返回 ret。
  • 为什么要循环两次链接? for link in l1:for link1 in l1:?你可以结合这些循环
  • 另外,您似乎在进行广度优先搜索。我会推荐一个具有深度限制的递归函数,而不是 for 循环的嵌套序列

标签: python parsing csv wikipedia pywikibot


【解决方案1】:

如果ret_list 为空,或者链接数少于请求的链接数,则代码会在没有任何显式return 语句的情况下进行分支,因此当它在函数末尾脱落时隐式返回None

在不涉及此代码的其他问题的情况下,您可能想要这样的东西:

def get_links(link):
    html = urllib.urlopen(link).read()
    soup = BeautifulSoup(html, "lxml")
    ret_list=soup.select('p a[href]')
    count=0
    ret=[]
    for tag in ret_list:
        link=tag['href']
        if link[0]=='/' and ':' not in link and link[:5]=='/wiki' and '#' not in link:
            ret.append(base_url+link)
            count=count+1
        if count==no_of_links:
            break
    return ret

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2015-05-08
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多