Python 美丽的汤错误:'&书信电报;类别';bs4.element.Tag'&燃气轮机';对象没有属性';目录';?

Python 美丽的汤错误:'&书信电报;类别';bs4.element.Tag'&燃气轮机';对象没有属性';目录';?,python,django,web-scraping,beautifulsoup,Python,Django,Web Scraping,Beautifulsoup,我正在写一个脚本,从文章中提取内容,删除任何不必要的东西,如脚本和样式。美丽的汤不断引发以下例外: '<class 'bs4.element.Tag'>' object has no attribute 'contents' 查看堆栈跟踪,问题似乎来自for语句后面的这个方法: # Remove divs that have more non-p elements than p elements for div in element.find_all('div'):

我正在写一个脚本,从文章中提取内容,删除任何不必要的东西,如脚本和样式。美丽的汤不断引发以下例外:

'<class 'bs4.element.Tag'>' object has no attribute 'contents'
查看堆栈跟踪,问题似乎来自for语句后面的这个方法:

    # Remove divs that have more non-p elements than p elements
    for div in element.find_all('div'):
        p = len(div.find_all('p')) # <-- div.find_all('p')

我认为问题在于,在
删除所有元素
或代码中的其他地方,您正在删除某些标记的
内容
属性

当您调用
以\u remove.decompose()
时,似乎发生了这种情况。以下是该方法的来源:

def decompose(self):
    """Recursively destroys the contents of this tree."""
    self.extract()
    i = self
    while i is not None:
        next = i.next_element
        i.__dict__.clear()
        i = next
如果手动调用此函数,会发生以下情况:

>> soup = BeautifulSoup('<div><p>hi</p></div>')
>>> d0 = soup.find_all('div')[0]
>>> d0
<div><p>hi</p></div>
>>> d0.decompose()
>>> d0
Traceback (most recent call last):
...
Traceback (most recent call last):
AttributeError: '<class 'bs4.element.Tag'>' object has no attribute 'contents'
>soup=BeautifulSoup(“hi

”) >>>d0=汤。查找所有('div')[0] >>>d0 嗨

>>>d0.分解() >>>d0 回溯(最近一次呼叫最后一次): ... 回溯(最近一次呼叫最后一次): AttributeError:“”对象没有属性“contents”
似乎一旦对标记调用了
decompose
,就不能再尝试使用该标记。但我不太确定这是在哪里发生的


我想检查的一件事是,在
trim()
函数中,
len(element.\uu dict\uuuuuuuuuuu)>0

我认为问题在于,在
删除所有元素
或代码中的其他地方,您正在删除某些标记的
内容
属性

当您调用
以\u remove.decompose()
时,似乎发生了这种情况。以下是该方法的来源:

def decompose(self):
    """Recursively destroys the contents of this tree."""
    self.extract()
    i = self
    while i is not None:
        next = i.next_element
        i.__dict__.clear()
        i = next
如果手动调用此函数,会发生以下情况:

>> soup = BeautifulSoup('<div><p>hi</p></div>')
>>> d0 = soup.find_all('div')[0]
>>> d0
<div><p>hi</p></div>
>>> d0.decompose()
>>> d0
Traceback (most recent call last):
...
Traceback (most recent call last):
AttributeError: '<class 'bs4.element.Tag'>' object has no attribute 'contents'
>soup=BeautifulSoup(“hi

”) >>>d0=汤。查找所有('div')[0] >>>d0 嗨

>>>d0.分解() >>>d0 回溯(最近一次呼叫最后一次): ... 回溯(最近一次呼叫最后一次): AttributeError:“”对象没有属性“contents”
似乎一旦对标记调用了
decompose
,就不能再尝试使用该标记。但我不太确定这是在哪里发生的


我要尝试检查的一件事是,在
trim()
函数中,
len(element.\uu dict\uuu)>0

这很奇怪。如果你发布了一个完整的回溯,这会很有帮助。你可能希望对for循环中的所有
remove\u all\u元素
调用求和。它不会解决当前的问题,但会提高代码的可读性。@iTayb谢谢提示:)这很奇怪。如果你发布了一个完整的回溯,这会很有帮助。你可能希望对for循环中的所有
remove\u all\u元素
调用求和。它不会解决当前的问题,但会增强代码的可读性。@iTayb谢谢提示:)我不确定,我唯一使用del语句的地方是del to_inspect[不需要的属性名称]。我注释掉了所有的remove_all_*函数,但它仍然不起作用。然后我取消了对所有内容的注释,并将p=len(div.find_all('p'))替换为p=99,令人惊讶的是,它停止了引发异常!:O我发现有点奇怪……我用div.extract()替换了div.decompose(),效果很好:)可能是因为div在for语句中被定义为元素的当前元素的别名。find_all('div'),而'decomposition'div会导致这些问题吗?用comment.decompose()替换comment.extract()也会出现错误,尽管是另一个('Comment'对象没有属性'decompose')。可能就是这样。我还能够通过使用嵌套表单的html重现您的错误:
“嗨

我不确定,我使用del语句的唯一地方是del to_inspect[不需要的属性名称]。我注释掉了所有的remove_all_*函数,但它仍然不起作用。然后我取消了对所有内容的注释,并将p=len(div.find_all('p'))替换为p=99,令人惊讶的是,它停止了引发异常!:O我发现有点奇怪……我用div.extract()替换了div.decompose(),效果很好:)可能是因为div在for语句中被定义为元素的当前元素的别名。find_all('div'),而'decomposition'div会导致这些问题吗?用comment.decompose()替换comment.extract()也会出现错误,尽管是另一个('Comment'对象没有属性'decompose')。可能就是这样。我还可以通过使用嵌套表单的html重现您的错误:
“hi

>> soup = BeautifulSoup('<div><p>hi</p></div>')
>>> d0 = soup.find_all('div')[0]
>>> d0
<div><p>hi</p></div>
>>> d0.decompose()
>>> d0
Traceback (most recent call last):
...
Traceback (most recent call last):
AttributeError: '<class 'bs4.element.Tag'>' object has no attribute 'contents'