【问题标题】:Python & BS4 | get all table data with specific text content蟒蛇和BS4 |获取具有特定文本内容的所有表格数据
【发布时间】:2019-12-30 14:12:06
【问题描述】:

我对 Python 和网络抓取非常陌生,因此提出以下问题。

我只想获取其中包含特定内容的表格。

这是 HTML 的外观: 它不是这个脚本中的第一个表,所以我想选择

    </TABLE></TD></TR>
    <TR>
    <TD COLSPAN=7 class='x2'>
    &nbsp;</TD>
    </TR>
    <TR>
    <TD style="vertical-align:bottom" class='x3'>
    EingangsdatumDMYY</TD>
    <TD style="vertical-align:bottom" class='x4'>
    Techniker</TD>
    <TD style="vertical-align:bottom" class='x5'>
    Techn.</TD>
    <TD style="vertical-align:bottom" class='x6'>
    Kunde</TD>
    <TD style="vertical-align:bottom" class='x7'>
    OffAuftrag</TD>
    <TD style="vertical-align:bottom" class='x8'>
    Planungsdatum</TD>
    <TD style="vertical-align:bottom" class='x8'>
    Herstellerreferenz</TD>
    </TR>
    <TR>
    <TD class='x9_0'>
    DATE </TD>
    <TD class='x10_0'>
    default</TD>
    <TD class='x11_0'>
    00000001</TD>
    <TD class='x12_0'>
    Company Name</TD>
    <TD class='x17_0'>
    1000000    ,STATUS, TECH, DATE TIME, **Product A**</TD>
    <TD class='x14_0'>
    &nbsp;</TD>
    <TD class='x15_0'>
    &nbsp;</TD>
    </TR>
    <TR>
    <TD class='x9_0'>
    DATE </TD>
    <TD class='x10_0'>
    default</TD>
    <TD class='x11_0'>
    00000001</TD>
    <TD class='x12_0'>
    Company Name</TD>
    <TD class='x18_0'>
    1000000    ,STATUS, TECH, DATE TIME, **Product B**</TD>
    <TD class='x14_0'>
    &nbsp;</TD>
    <TD class='x15_0'>
    &nbsp;</TD>
    </TR>
    <TR>
    <TD class='x9_0'>
    DATE </TD>
    <TD class='x10_0'>
    default</TD>
    <TD class='x11_0'>
    00000001</TD>
    <TD class='x12_0'>
    Company Name</TD>
    <TD class='x19_0'>
    1000000    ,STATUS, TECH, DATE TIME, **Product A**</TD>
    <TD class='x14_0'>
    &nbsp;</TD>
    <TD class='x15_0'>
    &nbsp;</TD>
    </TR>

我知道这段代码中使用的类很奇怪,但它是生成的,因此无法更改。

现在是我用来通过 BS4 获取 HTML 的代码:

import urllib2
from bs4 import BeautifulSoup

# specify the url
quote_page = 'Website.html'

# query the website and return the html to the variable page
page = urllib2.urlopen(quote_page)


# parse the html using beautiful soup and store in variable `soup`
soup = BeautifulSoup(page, 'html.parser')
tables = soup.findChildren('table')

my_table = tables[1]
rows = my_table.findChildren(['th', 'tr'])

print my_table

现在的问题:

我确实得到了第一行,但我想搜索整个网站并搜索其中包含文本“产品 A”的每个表,并将父级保存在一个数组中。

例如: 代码完成后,输出将是:

<TD class='x17_0'>
    1000000    ,STATUS, TECH, DATE TIME, **Product A**</TD>

<TD class='x19_0'>
    1000000    ,STATUS, TECH, DATE TIME, **Product A**</TD>

所以代码必须: 1) 通过 HTML 搜索并搜索文本“产品 A” 2)抓取父标签并将其保存在变量中。 3) 在整个 HTML 中重复。

我感激地接受每一个提示 -

感谢和最好的问候 亚尼克 L.

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    您可以在Bs4 中使用正则表达式来查找包含特定文本的元素。

    如果你想搜索所有包含特定字符串的td,你需要这个

    import re
    from bs4 import BeautifulSoup
    page = '''
    
        <TR>
        <TD COLSPAN=7 class='x2'>
        &nbsp;</TD>
        </TR>
        <TR>
        <TD style="vertical-align:bottom" class='x3'>
        EingangsdatumDMYY</TD>
        <TD style="vertical-align:bottom" class='x4'>
        Techniker</TD>
        <TD style="vertical-align:bottom" class='x5'>
        Techn.</TD>
        <TD style="vertical-align:bottom" class='x6'>
        Kunde</TD>
        <TD style="vertical-align:bottom" class='x7'>
        OffAuftrag</TD>
        <TD style="vertical-align:bottom" class='x8'>
        Planungsdatum</TD>
        <TD style="vertical-align:bottom" class='x8'>
        Herstellerreferenz</TD>
        </TR>
        <TR>
        <TD class='x9_0'>
        DATE </TD>
        <TD class='x10_0'>
        default</TD>
        <TD class='x11_0'>
        00000001</TD>
        <TD class='x12_0'>
        Company Name</TD>
        <TD class='x17_0'>
        1000000    ,STATUS, TECH, DATE TIME, **Product A**</TD>
        <TD class='x14_0'>
        &nbsp;</TD>
        <TD class='x15_0'>
        &nbsp;</TD>
        </TR>
        <TR>
        <TD class='x9_0'>
        DATE </TD>
        <TD class='x10_0'>
        default</TD>
        <TD class='x11_0'>
        00000001</TD>
        <TD class='x12_0'>
        Company Name</TD>
        <TD class='x18_0'>
        1000000    ,STATUS, TECH, DATE TIME, **Product B**</TD>
        <TD class='x14_0'>
        &nbsp;</TD>
        <TD class='x15_0'>
        &nbsp;</TD>
        </TR>
        <TR>
        <TD class='x9_0'>
        DATE </TD>
        <TD class='x10_0'>
        default</TD>
        <TD class='x11_0'>
        00000001</TD>
        <TD class='x12_0'>
        Company Name</TD>
        <TD class='x19_0'>
        1000000    ,STATUS, TECH, DATE TIME, **Product A**</TD>
        <TD class='x14_0'>
        &nbsp;</TD>
        <TD class='x15_0'>
        &nbsp;</TD>
        </TR>
    '''
    soup = BeautifulSoup(page, 'html.parser')
    tables = soup.findChildren('td', text=re.compile(r'Product A'))
    print(tables)
    

    【讨论】:

    • 感谢工作:D 我也可以选择下一个 td 吗?
    • 现在您已经找到了您需要的所有td,并且它们存储在一个列表中,您可以使用列表索引来选择它们。在上面的示例中,它们存储在tables 变量中,因此您可以使用tables[0] 选择第一个,使用tables[1] 选择第二个
    【解决方案2】:

    在 bs4 4.7.1+ 中,您可以使用 :contains 获取包含特定文本的表格。

    tables = soup.select('table:contains("Product A")')
    print(tables)
    

    如果您需要更具体地显示文本但想要整个表格,则带有 td 的表格:

    tables = soup.select('table:has(td:contains("Product A"))')
    print(tables)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2020-03-17
      • 2022-11-30
      相关资源
      最近更新 更多