【问题标题】:Can't solve: TypeError: expected string or buffer无法解决:TypeError:预期的字符串或缓冲区
【发布时间】:2016-11-10 21:09:05
【问题描述】:

我正在尝试编写一个代码,通过查找跨度标签和其中的数字来从 HTML 中删除数字。

我不断收到错误“预期的字符串或缓冲区”。

我在搜索不同的问题时阅读了一些解决方案,但是当我尝试 " ''.join(some_list)" 时,我又遇到了另一个错误:

“序列项0:预期字符串,找到标签”

试图搜索那个,看到了一些解决方案,例如使用.get 而不是re.findall,但错误仍然出现。

代码:

import urllib
from BeautifulSoup import *
url = raw_input('Enter the URL:')
stri = urllib.urlopen(url).read()
soup = BeautifulSoup(stri)

#retrieve of the span tags

spans = ''.join(soup('span'))
numlist = list()
for tag in spans:
    num = int(re.findall('[0-9]+', tag))
    numlist.append(num)
print(numlist)

我看到了针对此类错误的几种解决方案,但似乎无法解决。

我错过了什么?

我添加了 tag.text,错误已更改为另一个错误,现在我得到: "Errno 11004] getaddrinfo 失败"

我看了不同的帖子都解决不了,所以我一行一行的跑代码看问题出在哪里,发现是在运行原代码第四句的时候出现的:

html = urllib.urlopen(url).read()

请帮忙?

【问题讨论】:

  • 调试错误信息的第一步,是查找行号。您缺少行号。
  • Python 不只是说“预期的字符串或缓冲区”——它写了一个堆栈跟踪来显示有问题的行。您可以发布该堆栈跟踪以便我们查看吗?否则,我们不得不猜测问题出在哪里。
  • 调试提示:print 是你的朋友。我在您的代码中添加了print 'badness', type(soup('span')[0]) 并得到了badness <class 'BeautifulSoup.Tag'>。那不是可以加入的东西。

标签: python python-2.7 web-scraping beautifulsoup


【解决方案1】:

tag 是一个Tag 对象,其中包含大量信息,而不仅仅是一个字符串。如果您希望标签内的文本不带任何标记,请使用tag.text,例如:

spans = ''.join(tag.text for tag in soup('span'))
# now `for tag in spans:` makes no sense because spans is a string

spans = soup('span')
for tag in spans:
    num = len(re.findall('[0-9]+', tag.text))  # note len, not int

【讨论】:

  • 转换为整数的类型不起作用,因为re.findall 返回一个列表
  • @MosesKoledoye 谢谢,我复制粘贴没有看到int
  • @AlexHall 谢谢,所以我更改了代码并得到了一个不同的错误,我将详细信息添加到我的第一个错误问题中。
  • @DorZluf 这不是它的工作原理,每个问题都有一个问题。
猜你喜欢
  • 2013-04-18
  • 2016-01-24
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2016-07-15
相关资源
最近更新 更多