【问题标题】:Unwrap element with beautifulsoup4: does it affect the .string of parent element?用beautifulsoup4解包元素:它会影响父元素的.string吗?
【发布时间】:2015-02-15 17:01:15
【问题描述】:

我正在对表格中的文本数据进行网络抓取,例如以下表格,我希望获得结果:

Lorem ipsum
dolor sit amet
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat。

    html = '''
<table>
<tr class="title last ">
  <td>
   Lorem ipsum
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   <span class="caps">dolor
   </span>
   sit amet
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   consectetur adipiscing elit,
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </td>
  <td>
  </td>
 </tr>
</table>
'''

我用 beautifulsoup4 解开了 &lt;span&gt; 元素:

soup = BeautifulSoup(html)

# remove <span> tag but keep content
spans = soup.find_all('span')
for tag in spans:
    tag.unwrap()

但是,我为所有空的 &lt;td&gt; 元素提供了空行,或者“dolor sit amet”行不打印,即使我在使用 prettify 打印 html 时可以看到它。

# text with empty lines
for line in soup.find_all('td'):
    print(line.get_text().strip())
    print(line.string) # line with <span> prints None

# missing line <span>
for line in soup.find_all('td', text=re.compile(r'\w')):
    print(line.get_text().strip())

print(soup.prettify())

我做错了吗?我怎样才能使用 unwrap() 并且仍然访问所有没有空行的文本内容?

感谢您的帮助!

【问题讨论】:

    标签: html web-scraping beautifulsoup python-3.4


    【解决方案1】:

    我可以测试,你就在附近。应用strip(),然后使用re模块将多个空格替换为一个,例如:

    from bs4 import BeautifulSoup
    import re
    
    html = ''' 
    <table>
    <tr class="title last ">
      <td>
       Lorem ipsum
      </td>
      <td>
      </td>
     </tr>
     <tr>
      <td>
       <span class="caps">dolor
       </span>
       sit amet
      </td>
      <td>
      </td>
     </tr>
     <tr>
      <td>
       consectetur adipiscing elit,
      </td>
      <td>
      </td>
     </tr>
     <tr>
      <td>
       sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
      </td>
      <td>
      </td>
     </tr>
     <tr>
      <td>
        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
      </td>
      <td>
      </td>
     </tr>
    </table>
    '''
    
    soup = BeautifulSoup(html)
    
    # remove <span> tag but keep content
    spans = soup.find_all('span')
    for tag in spans:
        tag.unwrap()
    
    print('\n'.join(
      re.sub(r'\s+', ' ', td.text.strip()) 
        for td in soup.find_all('td') if td.text.strip()))
    

    它产生:

    Lorem ipsum
    dolor sit amet
    consectetur adipiscing elit,
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    

    【讨论】:

    • 太好了,谢谢!如果我可能会问,td.text.strip()td.get_text().strip() 有什么区别?为什么text=re.compile(r'\w')与“dolor sit amet”不匹配?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2021-11-26
    • 2013-08-01
    • 1970-01-01
    • 2023-03-24
    • 2012-09-21
    • 2015-05-03
    相关资源
    最近更新 更多