如何使用标签提取标签内的文本?

Posted

技术标签:

【中文标题】如何使用标签提取标签内的文本?【英文标题】:how to extract text inside a tag with its tags? 【发布时间】:2020-02-08 17:36:33 【问题描述】:

我想使用beautifulsoup 解析一个html 页面。我想在不删除内部 html 标签的情况下提取标签内的文本。例如样本输入:

<a class="fl" href="https://***.com/questio...">
    Angular2 <b>Router link not working</b>
</a>

样本输出:

'Angular2 <b>Router link not working</b>'

我试过这个:

from bs4 import Beautifulsoup
string = '<a class="fl" href="https://***.com/questio...">
         Angular2 <b>Router link not working</b>
         </a>'
soup = Beautifulsoup(string, 'html.parser')
print(soup.text)

但它给出了:

'Angular2 Router link not working'

如何在不删除内部标签的情况下提取文本?

【问题讨论】:

您是否尝试过不将解析器传递给Beautifulsoup 构造函数然后转换为字符串? 已经在这里回答:***.com/questions/8112922/beautifulsoup-innerhtml @helenej 感谢您的回复。我试过了,但没有用。它再次给&lt;a class...&gt;An...&lt;/a&gt; 【参考方案1】:

来自here 的第一个答案工作正常。对于这个例子:

from bs4 import Beautifulsoup
string = '<a class="fl" href="https://***.com/questio...">
             Angular2 <b>Router link not working</b>
         </a>'
soup = BeautifulSoup(string, 'html.parser')
soup.find('a').encode_contents().decode('utf-8')

它给出:

'Angular2 <b>Router link not working</b>'

【讨论】:

干得好@hamid。我试图使用.encode_contents(),但它也回馈了外部标签。我看到您必须指定 .find('a') 才能执行您需要的操作。感谢您发布您自己问题的解决方案,这非常有益!【参考方案2】:

当您编写print(soup.text) 时,您正在从标签“a”中提取所有文本,包括其中的每个标签。 如果您只想获取标签“b”对象,您应该尝试下一步:

soup = BeautifulSoup(string, 'html.parser')
b = soup.find('b')
print(b)
print(type(b))

soup = BeautifulSoup(string, 'html.parser')
b = soup.find('a', class_="fl").find('b')
print(b)
print(type(b))

输出:

<b>Router link not working</b>
<class 'bs4.element.Tag'>

如您所见,它将在 beautifullsoup 对象中返回您的标签“b”

如果你需要字符串格式的数据,你可以写:

b = soup.find('a', class_="fl").find('b')
b = str(b)
print(b)
print(type(b))

输出:

<b>Router link not working</b>
<class 'str'>

【讨论】:

这个答案给出了&lt;b&gt; 的唯一内部,并在此示例Angular2 中删除了文本的第一部分。我想保留整个文本及其内部标签。【参考方案3】:

正如 Den 所说,您需要获取该内部标签,然后将其存储为类型 str 以包含该内部标签。在 Den 给定的解决方案中,它将专门获取 &lt;b&gt; 标签,而不是父标签/文本,如果其中有其他样式类型的标签,则不会。但是如果还有其他标签,你可以更笼统,让它找到&lt;a&gt;标签的子元素,而不是专门寻找&lt;b&gt;标签。

所以基本上这将做的是找到&lt;a&gt; 标签并获取整个文本。然后它将进入该 &lt;a&gt; 标记的子项,将其转换为字符串,然后用该字符串(包括标记)替换该父文本中的文本

string = '''<a class="fl" href="https://***.com/questio...">
     Angular2 <b>Router link not working</b> and then this is in <i>italics</i> and this is in <b>bold</b>
     </a>'''



from bs4 import BeautifulSoup, Tag

soup = BeautifulSoup(string, 'html.parser')
parsed_soup = ''

for item in soup.find_all('a'):
    if type(item) is Tag and 'a' != item.name:
        continue
    else:
        try:
            parent = item.text.strip()
            child_elements = item.findChildren()
            for child_ele in child_elements:
                child_text = child_ele.text
                child_str = str(child_ele)


                parent = parent.replace(child_text, child_str)
        except:
            parent = item.text

print (parent)

输出:

print (parent)
Angular2 <b>Router link not working</b> and then this is in <i>italics</i> and this is in <b>bold</b>

【讨论】:

以上是关于如何使用标签提取标签内的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何动态调整 UITableViewCell 内的两个文本标签宽度?

如何使用 PHP 将文本附加到特定标签内的外部 html 文件?

如何使用正则表达式从某些文本中提取脚本标签?

如何使用 Python 3 提取某些 html 标签之间的文本? [复制]

按顺序提取文本标签 - 如何做到这一点?

如何使用BS4从标签外部提取文本