BeautifulSoup4 table

BeautifulSoup4 table

我找到了几篇关于如何执行此操作的文章,但我对 bs4 的任何文章都不满意。谁能帮我弄清楚如何使用 bs4 从 table 中提取 filename.doc?我已经尝试了一百万件事,但运气不佳,无法在文档中找到答案。 我正在抓取的 html 中还有其他 table 具有 <table class="layout">

table 我正在尝试解析:

<table class="layout">
  <tbody>
    <tr>.(truncating td's).</tr>
    <tr>.(truncating td's).</tr>
    <tr>.(truncating td's).</tr>
    <tr>.(truncating td's).</tr>
    <tr>
      <td style="color:999999;"></td>
      <td>filename.doc</td>
    </tr>
  </tbody>
</table>

这是我正在尝试的 py 代码。

from bs4 import BeautifulSoup
from pprint import pprint 
soup = BeautifulSoup(open("/home/myuser/message_tracking.html"), "html.parser")

table = soup.find('table', attrs={'class':'layout'})
print table
table_body = table.findAll('tr')
print table_body

因为这个 table 没有很多我可以使用的独特属性,我如何从这个 html 中提取 'filename.doc'?预先感谢大家花时间提供帮助!

我们只找到 .doc 结尾的元素怎么样?干净且可读:

>>> import re
...
>>> soup.find(text=re.compile(r"\.doc$"))
u'filename.doc'
>>> soup.find("td", text=re.compile(r"\.doc$")).get_text()
u'filename.doc'
>>> soup.find(text=lambda text: text and text.endswith("doc"))
u'filename.doc'
>>> soup.find("td", text=lambda text: text and text.endswith("doc")).get_text()
u'filename.doc'

\ 转义点,$ - 是字符串的结尾。

您可以概括该问题以处理多个扩展。例如,您可以定义一个扩展元组并传递给 endswith():

>>> EXTENSIONS = ('doc', 'docx')
>>> soup.find("td", text=lambda text: text and text.endswith(EXTENSIONS)).get_text()
u'filename.doc'

或者,您可以改进正则表达式以期望字符串末尾的点后跟 3 个或更多小写字母:

>>> soup.find("td", text=re.compile(r"\.[a-z]{3,}$")).get_text()
u'filename.doc'

此外,如果这 始终是 table 中的最后一个 td 元素 ,您可以:

>>> table = soup.find('table', attrs={'class':'layout'})
>>> table.find_all("td")[-1].get_text()
u'filename.doc'

好吧好吧...据我所知,没有太多选择。所以这是我的尝试:

  1. 匹配第n个元素(如果顺序不变)

    soup.findAll('td')[42]
    
  2. 匹配以 .doc

    结尾的 td
    soup.find('td', text=lambda text: text.endswith('.doc'))
    
string = '''
<table class="layout">
  <tbody>
    <tr>.(truncating td's).</tr>
    <tr>.(truncating td's).</tr>
    <tr>.(truncating td's).</tr>
    <tr>.(truncating td's).</tr>
    <tr>
      <td style="color:999999;"></td>
      <td>filename.doc</td>
    </tr>
  </tbody>
</table>
'''


from bs4 import BeautifulSoup

soup = BeautifulSoup(string,"html.parser")
ans = [tddata.get_text() for tabledata in soup.find_all('table',{'class':'layout'}) for tddata in tabledata.find_all('td')]

print(ans[1])

此处 ans 是 table class ="layout"

的每个 td 标签中可用的文本列表

要删除空字符串,您可以这样做:

finalans = [each for each in ans if not(each == '')]