【问题标题】:Get table contents only after specific span content in Beautifulsoup仅在 Beautifulsoup 中的特定跨度内容之后获取表格内容
【发布时间】:2021-02-13 15:54:21
【问题描述】:

我有一个 html 文件,其中包含多个 div 并且没有类或 id 名称:

<div><span>Item 1</span></div>
<div>some content</div>
<div><table><tbody>table content</tbody></table></div>

<div><span>Item 2</span></div>
<div>some content</div>
<div><table><tbody>table content</tbody></table></div>

<div><span>Item 3</span></div>
<div>some content</div>
<div><table><tbody>table content</tbody></table></div>

<div><span>Item 4</span></div>
<div>some content</div>
<div><table><tbody>table content</tbody></table></div>

目标:
我只想在 Item 3 之后获取 table 的内容,并且搜索是一般性的,以获取任何 table after 特定 Item数字。请注意,项目的数量可能会有所不同。

试过了:
我试过这段代码:

if soup.find('span') == 'Item 3. Selected Financial Data':
    table_tag = soup.find('tbody')

但它仍然返回从顶部开始的第一个表。

我还尝试查看 .next_siblings 和 .next_element 但没有更好的方法来实现这一点吗? https://www.crummy.com/software/BeautifulSoup/bs4/doc/#going-sideways

这里有一个类似的问题:get text after specific tag with beautiful soup,但它不涉及 div 中的表。

请帮忙。

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    只需使用find_all_next:

    table = soup.find(text='Item 3').find_all_previous()[2].find_all_next()
    

    我的完整代码:

    from bs4 import BeautifulSoup
    
    html = '''
    <div><span>Item 1</span></div>
    <div>some content</div>
    <div><table><tbody>table content</tbody></table></div>
    
    <div><span>Item 2</span></div>
    <div>some content</div>
    <div><table><tbody>table content</tbody></table></div>
    
    <div><span>Item 3</span></div>
    <div>some content</div>
    <div><table><tbody>table content</tbody></table></div>
    
    <div><span>Item 4</span></div>
    <div>some content</div>
    <div><table><tbody>table content</tbody></table></div>
    '''
    
    soup = BeautifulSoup(html,'html5lib')
    
    table = soup.find(text='Item 3').find_all_previous()[2].find_all_next()
    
    table_html = ''.join([str(elem) for elem in table])
    

    输出:

    >>> table
    [<div><span>Item 3</span></div>, <span>Item 3</span>, <div>some content</div>, <div>table content<table><tbody></tbody></table></div>, <table><tbody></tbody></table>, <tbody></tbody>, <div><span>Item 4</span></div>, <span>Item 4</span>, <div>some content</div>, <div>table content<table><tbody></tbody></table></div>, <table><tbody></tbody></table>, <tbody></tbody>]
    
    >>> table_html
    '<div><span>Item 3</span></div><span>Item 3</span><div>some content</div><div>table content<table><tbody></tbody></table></div><table><tbody></tbody></table><tbody></tbody><div><span>Item 4</span></div><span>Item 4</span><div>some content</div><div>table content<table><tbody></tbody></table></div><table><tbody></tbody></table><tbody></tbody>'
    

    【讨论】:

    • 根据你的回答,我注意到以下方法也可以工作,但不确定它是否能很好地概括:table = soup.find(text='Item 3').find_next('tbody')
    • 顺便说一句,如果我的回答对您有所帮助,请支持我的回答并接受它作为最佳回答。谢谢!
    • 我更新了我的问题以包含 标签
    • 我稍微修改了它,特别是根据我的需要,但它确实有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多