【问题标题】:How to get text from nested html table with beautifulsoup?如何使用 Beautifulsoup 从嵌套的 html 表中获取文本?
【发布时间】:2021-05-15 05:25:21
【问题描述】:

在每个主表中,分别嵌套了两个表,其中第一个包含我要提取到 pandas.dataframe 的数据 A_A_A_A

<table>
<tr valign="top">
   <td> </td>
   <td>
      <br/>
      <center>
         <h2>asd</h2>
      </center>
      <h4>asd</h4>
      <table>
         <tr>
         </tr>
      </table>
      <table border="0" cellpadding="0" cellspacing="0" class="tabcol" width="100%">
         <tr>
            <td> </td>
         </tr>
         <tr>
            <td width="3%"> </td>
            <td>
               <table border="0" width="100%">
                  <tr>
                     <td width="2%"> </td>
                     <td> A_A_A_A <br/> A_A_A_A <a href="http://url.com" target="new">111</a>-222<br/> </td>
                     <td width="2%"> </td>
                  </tr>
               </table>
            </td>
            <td width="3%"> </td>
         </tr>
         <tr>
            <td width="3%"> </td>
            <td>
               <table border="0" cellpadding="0" cellspacing="0" width="100%">
                  <tr>
                     <td width="4%"> </td>
                     <td class="unique"> asd <br/> asd </td>
                     <td width="4%"> </td>
                  </tr>
               </table>
            </td>
            <td width="3%"> </td>
         </tr>
         <tr>
            <td> </td>
         </tr>
      </table>
      <table border="0" cellpadding="0" cellspacing="0" class="tabcol" width="100%">
      . 
      .
      .
      </table>
      <br/>
      <table>
      </table>
   </td>
</tr>
</table>

我认为由于属性的可用性有限,前进的唯一方法是迭代 td 兄弟姐妹和 .next_siblings,如果需要 .next_elements

data1 = []
for item in soup.find_all('td', attrs={'width': '2%'}):
    data = item.find_next_sibling().text
    data1.append(data)

返回空列表[]。现在我不知道,因为我无法识别任何其他有用的属性/类来帮助我到达包含信息的中间td

【问题讨论】:

    标签: python html beautifulsoup css-selectors


    【解决方案1】:

    .find_next(name=None, attrs={}, text=None, **kwargs)

    返回与给定条件匹配并出现在文档中此标记之后的第一个项目。所以在你的情况下:

    item = soup.find('td', attrs={'width': '2%'})
    data = item.find_next('td').text
    

    请注意,我删除了 for 循环,因为所需的数据位于第一个 tdwidth: '2%' 之后。运行后,data 将是:

    ' A_A_A_A  A_A_A_A 111-222 '
    

    【讨论】:

      【解决方案2】:

      我从这里@Wiktor Stribiżew 回答regex for loop over list in python 并将其与您的@Rustam Garayev 合并

      item = soup.find_all('td', attrs={'width': '2%'})
      data = [x.find_next('td').text for x in item]
      

      因为我不仅需要第一个 AAAA,还需要以下所有表格。上面的代码给出了这个输出:

      ['A_A_A_A',
       '\xa0',
       'A_A_A_A',
       '\xa0', ...]
      

      这对我的目的来说已经足够了。我认为'\xa0' 来自它试图在第三个td 兄弟上执行find_next,它没有连续的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        • 2016-03-24
        相关资源
        最近更新 更多