BeautifulSoup和Python删除HTML标记

2024-03-28 19:08:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助从脚本的结果中解析出HTML标记。我想把结果放在一个对象中转换成json。当我打印对象时,一切都正常,除了我不能只提取没有html标记的文本。我一直在这个网站上搜索答案,并尝试了各种方法删除标签,但我不知道我做错了什么。谢谢你的帮助。你知道吗

根据我在这里读到的一些东西,我试着打印团队对象.text但这行不通。你知道吗

def make_soup(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    return soup

soup = make_soup("team.html")
for record in soup.findAll('tr'):
    teamObject = {"name": record.find('a'),"description": record.find('p')}
    print (teamObject)

我希望在没有html标记的对象表单中看到结果。你知道吗

根据评论更新:

我现在看到的结果是打印上面的代码:

{'name': <a href="/team/001"> Team 1 </a>, 'description': <p><a href="/team/001">Team 1</a> is a team does cool things.</p>}

正在更新要包含的代码。文本:

def make_soup(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    return soup


soup = make_soup("team.html")
for record in soup.findAll('tr'):
    teamObject = {
        "name": record.find('a').text,
        "description": record.find('p').text
        }
    print (teamObject)

我得到这个结果:

"name": record.find('a').text,
AttributeError: 'NoneType' object has no attribute 'text'

我希望只看到没有html标记的文本。你知道吗


Tags: 对象textname标记文本urlmakehtml
1条回答
网友
1楼 · 发布于 2024-03-28 19:08:41

尝试对循环中每个记录的find结果使用.text。你知道吗

for record in soup.findAll('tr'):
    teamObject = {
        "name": record.find('a').text,
        "description": record.find('p').text
        }

.text调用.get_text(),因此这与上面的注释类似,但我认为您希望在上次搜索中获得文本结果。你知道吗

如果需要传入格式化参数,可以使用get_text()。See the docs

编辑:

收到一个NoneType错误告诉我您有一些<tr>标记,但其中不包含<a><p>标记。如果记录.查找在循环中找不到结果,则它将返回None,而None不能返回文本值。你知道吗

你可以用逻辑来解决这个问题,或者重新评估你是如何接近搜索的。黑客的方法是在返回文本之前检查你是否有你需要的标签。你知道吗

for record in soup.findAll('tr'):
    if record.a and record.p:
        teamObject = {
            "name": record.find('a').text,
            "description": record.find('p').text
            }

这确保您不会收到None错误,但是现在您将完全跳过任何缺少<a><p>标记的行,所以要小心。你知道吗

如果您确信相关行总是有<a><p>标记,那么您可以通过只返回带有“Team”的行来集中搜索,以排除任何错误的<tr>条目。你知道吗

for record in soup.select('tr:contains("Team")'):
    teamObject = {
        "name": record.find('a').text,
        "description": record.find('p').text
        }

相关问题 更多 >