繁体   English   中英

BeautifulSoup:标签封装格式

[英]BeautifulSoup: tag enclosing formatting

当我美化汤时,我试图得到这个:

<tag attr="val" />

而不是这个:

<tag attr="val"></tag>

我检查了bs4.formatter代码,但没有找到与我的需求相关的选项:

def __init__(
            self, language=None, entity_substitution=None,
            void_element_close_prefix='/', cdata_containing_tags=None,
            empty_attributes_are_booleans=False, indent=1,
    ):

我怎样才能做到这一点? 谢谢

我尝试使用 new_tap 选项和 bs4.formatter 选项。

我不确定你为什么要这样做,因为 bs4 会生成有效的 html,这会搞乱它,但你可以使用这个函数:

def closeVoidElements(html, voidEls=None, parser=None, pFormatter=None):
    if type(voidEls) != list:            
        voidEls = [ 
            'area', 'base', 'br', 'col', 'command', 'embed', 'wbr', 'img', 
            'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'hr'
        ] # void elements from https://www.w3.org/TR/2011/WD-html-markup-20110113/syntax.html#syntax-elements 
    
    html = BeautifulSoup(str(html), parser)
    if voidEls: voidEls = set([t.name for t in html.find_all(voidEls)])    
    html = html.prettify()

    for ve in voidEls: 
        html = html.replace(f'<{ve}', f'<{ve}_x').replace(f'{ve}>', f'{ve}_x>')
    html = BeautifulSoup(html, parser).prettify(formatter=pFormatter)
    for ve in voidEls: 
        html = html.replace(f'<{ve}_x', f'<{ve}').replace(f'{ve}_x>', f'{ve}>')
    return html

并将其称为closeVoidElements(soup)而不是soup.prettify() (它基本上是在更改自闭合标签的标签名称,因此 bs4 无法识别它们,然后在将它们改回之前进行解析和美化。)

之前,曾经一个selfClosingTags arguments 用于 xml,但是已经停用了。

BeautifulSoup<a>在标签中不显示标签</a><div></div><div id="text_translate"><p>在我做的一些测试中,我注意到<strong>div</strong>标签内的标签<strong>a</strong> , <strong>beautifulsoup</strong>自动将其“翻译”为文本:</p><pre> &lt;div class='a'&gt; &lt;a href='....'&gt;TEXT&lt;/a&gt; &lt;i..... &lt;/div&gt;</pre><p> 当我使用命令find_all('div', {'class': 'a'})搜索<strong>div</strong>标签并尝试打印结果div.a时,bs4 显示值<strong>None</strong> ...但如果我尝试使用print div.text bs4 仅显示<strong>TEXT</strong>而不是标签<strong>a</strong> )。</p><p> 这是部分代码:</p><pre> soup = BeautifulSoup(html, 'lxml') data=soup.find_all('div', {'class': 'a'}) for div in data: print div.a $ None</pre><p> 为什么?</p><p> <strong>更新</strong>:刚才我注意到......这是另一个问题。 在源代码中有标签<strong>a</strong> ...但是现在,(看到带有美化的 output)我意识到标签 bs4 让我将其视为<strong>div</strong> ,而实际上它是标签<strong>a</strong> ! 奇怪的!!!</p><p> 漏洞???</p><p> <strong>解决</strong>了我做了一些清理并删除了请求和urllib3的所有包......然后我用<strong>apt</strong>重新安装了所有东西,现在可以工作了。 requests 和 urllib3 的包版本分别为: <strong>2.12.4-1</strong>和<strong>1.19.1-1</strong></p></div>

[英]BeautifulSoup not show tag <a> in tag <div>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 BeautifulSoup:只要进入标签内部,无论有多少封闭标签 BeautifulSoup标签 beautifulsoup:格式和转换问题 BeautifulSoup剪贴格式 在BeautifulSoup中打印和格式化结果 如何摆脱 Python 中带有 BeautifulSoup 的段落文本? BeautifulSoup<a>在标签中不显示标签</a><div></div><div id="text_translate"><p>在我做的一些测试中,我注意到<strong>div</strong>标签内的标签<strong>a</strong> , <strong>beautifulsoup</strong>自动将其“翻译”为文本:</p><pre> &lt;div class='a'&gt; &lt;a href='....'&gt;TEXT&lt;/a&gt; &lt;i..... &lt;/div&gt;</pre><p> 当我使用命令find_all('div', {'class': 'a'})搜索<strong>div</strong>标签并尝试打印结果div.a时,bs4 显示值<strong>None</strong> ...但如果我尝试使用print div.text bs4 仅显示<strong>TEXT</strong>而不是标签<strong>a</strong> )。</p><p> 这是部分代码:</p><pre> soup = BeautifulSoup(html, 'lxml') data=soup.find_all('div', {'class': 'a'}) for div in data: print div.a $ None</pre><p> 为什么?</p><p> <strong>更新</strong>:刚才我注意到......这是另一个问题。 在源代码中有标签<strong>a</strong> ...但是现在,(看到带有美化的 output)我意识到标签 bs4 让我将其视为<strong>div</strong> ,而实际上它是标签<strong>a</strong> ! 奇怪的!!!</p><p> 漏洞???</p><p> <strong>解决</strong>了我做了一些清理并删除了请求和urllib3的所有包......然后我用<strong>apt</strong>重新安装了所有东西,现在可以工作了。 requests 和 urllib3 的包版本分别为: <strong>2.12.4-1</strong>和<strong>1.19.1-1</strong></p></div> Beautifulsoup删除标签 用 BeautifulSoup 包装标签的内容 标签内的Beautifulsoup文本
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM