gpt4 book ai didi

python - BeautifulSoup 在元标签上出错

转载 作者:太空宇宙 更新时间:2023-11-03 18:15:18 25 4
gpt4 key购买 nike

我有这个功能来读取保存在计算机上的 HTML 文件:

 def get_doc_ondrive(self,mypath):
the_file = open(mypath,"r")
line = the_file.readline()
if(line != "")and (line!=None):
self.soup = BeautifulSoup(line)
else:
print "Something is wrong with line:\n\n%r\n\n" % line
quit()
print "\t\t------------ line: %r ---------------\n" % line
while line != "":
line = the_file.readline()
print "\t\t------------ line: %r ---------------\n" % line
if(line != "")and (line!=None):
print "\t\t\tinner if executes: line: %r\n" % line
self.soup.feed(line)
self.get_word_vector()
self.has_doc = True

执行 self.soup = BeautifulSoup(open(mypath,"r")) 返回 None,但逐行输入至少会崩溃并给我一些东西可以看。

我编辑了 BeautifulSoup.py 和 sgmllib.py 中回溯列出的函数

当我尝试运行它时,我得到:

me@GIGABYTE-SERVER:code$ python test_docs.py
in sgml.finish_endtag

in _feed: inDocumentEncoding: None, fromEncoding: None, smartQuotesTo: 'html'
in UnicodeDammit.__init__: markup: '<!DOCTYPE html>\n'
in UnicodeDammit._detectEncoding: xml_data: '<!DOCTYPE html>\n'
in sgmlparser.feed: rawdata: '', data: u'<!DOCTYPE html>\n' self.goahead(0)
------------ line: '<!DOCTYPE html>\n' ---------------
------------ line: '<html dir="ltr" class="client-js ve-not-available" lang="en"><head>\n' ---------------
inner if executes: line: '<html dir="ltr" class="client-js ve-not-available" lang="en"><head>\n'
in sgmlparser.feed: rawdata: u'', data: '<html dir="ltr" class="client-js ve-not-available" lang="en"><head>\n' self.goahead(0)
in sgmlparser.goahead: end: 0,rawdata[i]: u'<', i: 0,literal:0
in sgmlparser.parse_starttag: i: 0, __starttag_text: None, start_pos: 0, rawdata: u'<html dir="ltr" class="client-js ve-not-available" lang="en"><head>\n'
in sgmlparser.goahead: end: 0,rawdata[i]: u'<', i: 61,literal:0
in sgmlparser.parse_starttag: i: 61, __starttag_text: None, start_pos: 61, rawdata: u'<html dir="ltr" class="client-js ve-not-available" lang="en"><head>\n'
------------ line: '<meta http-equiv="content-type" content="text/html; charset=UTF-8">\n' ---------------
inner if executes: line: '<meta http-equiv="content-type" content="text/html; charset=UTF-8">\n'
in sgmlparser.feed: rawdata: u'', data: '<meta http-equiv="content-type" content="text/html; charset=UTF-8">\n' self.goahead(0)
in sgmlparser.goahead: end: 0,rawdata[i]: u'<', i: 0,literal:0
in sgmlparser.parse_starttag: i: 0, __starttag_text: None, start_pos: 0, rawdata: u'<meta http-equiv="content-type" content="text/html; charset=UTF-8">\n'
in sgml.finish_starttag: tag: u'meta', attrs: [(u'http-equiv', u'content-type'), (u'content', u'text/html; charset=UTF-8')]
in start_meta: attrs: [(u'http-equiv', u'content-type'), (u'content', u'text/html; charset=UTF-8')] declaredHTMLEncoding: u'UTF-8'
in _feed: inDocumentEncoding: u'UTF-8', fromEncoding: None, smartQuotesTo: 'html'
in UnicodeDammit.__init__: markup: None
in UnicodeDammit._detectEncoding: xml_data: None

和回溯:

Traceback (most recent call last):
File "test_docs.py", line 28, in <module>
newdoc.get_doc_ondrive(testeee)
File "/home/jddancks/Capstone/Python/code/pkg/vectors/DOCUMENT.py", line 117, in get_doc_ondrive
self.soup.feed(line)
File "/usr/lib/python2.7/sgmllib.py", line 104, in feed
self.goahead(0)
File "/usr/lib/python2.7/sgmllib.py", line 139, in goahead
k = self.parse_starttag(i)
File "/usr/lib/python2.7/sgmllib.py", line 298, in parse_starttag
self.finish_starttag(tag, attrs)
File "/usr/lib/python2.7/sgmllib.py", line 348, in finish_starttag
self.handle_starttag(tag, method, attrs)
File "/usr/lib/python2.7/sgmllib.py", line 385, in handle_starttag
method(attrs)
File "/usr/lib/python2.7/dist-packages/BeautifulSoup.py", line 1618, in start_meta
self._feed(self.declaredHTMLEncoding)
File "/usr/lib/python2.7/dist-packages/BeautifulSoup.py", line 1172, in _feed
smartQuotesTo=self.smartQuotesTo, isHTML=isHTML)
File "/usr/lib/python2.7/dist-packages/BeautifulSoup.py", line 1776, in __init__
self._detectEncoding(markup, isHTML)
File "/usr/lib/python2.7/dist-packages/BeautifulSoup.py", line 1922, in _detectEncoding
'^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data)
TypeError: expected string or buffer

所以这一行

<meta http-equiv="content-type" content="text/html; charset=UTF-8">\n

以某种方式导致在 UnicodeDammit 中解析空字符串。为什么会发生这种情况?

最佳答案

我刚刚读完 the source我想我理解这个问题。本质上,BeautifulSoup 认为事情应该是这样的:

  1. 您调用BeautifulSoup带有整个标记。
  2. 设置self.markup到该标记。
  3. 它调用 _feed本身,它会重置文档并以最初检测到的编码对其进行解析。
  4. 在进食时,它发现了 meta声明不同编码的标签。
  5. 要使用这种新编码,它会调用 _feed再次对其自身进行重新解析 self.markup .
  6. 第一个之后 _feed以及 _feed它递归到已完成,它设置 self.markupNone 。 (毕竟,我们现在已经解析了所有内容;<sarcasm> 谁可能永远还需要原始标记?</sarcasm>)

但是你使用它的方式:

  1. 您调用BeautifulSoup与标记的第一行。
  2. 设置self.markup到标记的第一行并调用 _feed .
  3. _feed没有看到有趣的meta标记在第一行,因此成功完成。
  4. 构造函数认为我们已经完成解析,因此它设置 self.markup返回None并返回。
  5. 您调用feed关于BeautifulSoup对象,直接进入 SGMLParser.feed实现,不被 BeautifulSoup 覆盖.
  6. 它看到了一个有趣的meta标记和调用 _feed以这种新编码解析文档。
  7. _feed尝试构建一个 UnicodeDammit对象 self.markup .
  8. 它爆炸了,因为 self.markupNone ,因为它认为只会在 BeautifulSoup 的构造函数中的那一小段时间内被调用。 .

这个故事的寓意是 feed是将输入发送到 BeautifulSoup 的不受支持的方式。您必须一次将所有输入传递给它。

至于为什么BeautifulSoup(open(mypath, "r"))返回None , 我不知道;我没有看到__new__定义于BeautifulSoup ,所以看起来它必须返回 BeautifulSoup对象。

综上所述,您可能想考虑使用 BeautifulSoup 4 而不是 3。Here’s the porting guide.为了支持Python 3,它必须删除对SGMLParser的依赖。 ,如果在重写的这一部分期间您遇到的任何错误得到修复,我不会感到惊讶。

关于python - BeautifulSoup 在元标签上出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25110564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com