【问题标题】:TypeError: expected a character buffer object when writing parsing resultTypeError:写入解析结果时需要一个字符缓冲区对象
【发布时间】:2013-06-29 19:58:06
【问题描述】:
import requests
from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_data(self, data):
        return data

def criapagina():
    r = requests.get('http://shadowcores.twifysoft.net/character.php?name=Sonda+Aquatica')
    fo = open('teste.txt', 'w')
    fo.write(r.content)
    print fo.readline
    fo.close()

def lepagina():
    fo = open('teste.txt', 'r+')
    for line in fo:
        parser = MyHTMLParser()
        fo.write(parser.feed(line))
        fo.close()


lepagina()

我想在读取正确的行后解析 html 并写入文件,例如名称:Sonda 级别:bla bla 但我什至无法将其保存在文件中,因为我收到了错误:TypeError: expected a character buffer object

【问题讨论】:

  • 你的读写同时会失败;您没有尝试控制 teste.txt 中的 where 您正在编写解析器结果。你想做什么?
  • 此外,您检查过parser.feed() 返回的内容吗?它不是字符串,这是肯定的。
  • 你从来没有打电话给criapaginarequests 这里根本没有使用。
  • 我以前叫过 criapagina :P 所以我已经有了 teste.txt

标签: python html-parsing


【解决方案1】:

您收到错误是因为HTMLParser.feed() 返回None;您不能将None 写入文件:

>>> open('/tmp/test.txt', 'w').write(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a character buffer object

否则您对teste.txt 的读写尝试将失败;您应该将文件对象视为迭代器 (for line in fo) 并期望能够写入文件。文件迭代器使用预读缓冲区,您不知道您的写入将在文件中结束。

否则完全不清楚您要做什么。通常,您会编写HTMLParser 类的自定义子类,用于收集实例属性中的数据。然后你调用.feed(),然后你从这些属性中收集你想要的任何东西。

您最好使用更简单的 HTML API,例如 BeautifulSoup,它不需要您创建解析器子类,并且在处理简单的 HTML 提取任务时更容易使用。

【讨论】:

  • 正如马丁所说,返回类型是none,但是您可以尝试将系统重定向到文件,这肯定会起作用,否则建议您使用Beautiful Soup :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2016-11-05
相关资源
最近更新 更多