BeautifulSoup4表

时间:2016-03-29 15:24:54

标签: python html web-scraping beautifulsoup html-parsing

我发现了几篇关于如何做到这一点的文章,但我对bs4的任何一个都没有运气。任何人都可以帮我弄清楚如何用bs4从这个表中取出filename.doc?我已经尝试了一百万件事,我没有太多运气,也无法在文档中找到答案。 我正在抓取的其他表格中有<table class="layout">

我正在尝试解析的表:

<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

因为这个表没有很多我可以使用的独特属性,所以如何从这个html中提取'filename.doc'?谢谢大家提前花时间帮忙!

3 个答案:

答案 0 :(得分:4)

我们如何找到.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'

此外,如果始终是表格中的最后一个td元素,您可以执行以下操作:

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

答案 1 :(得分:1)

很好......从我看到的情况来看,没有太多选择。所以这是我的尝试:

  1. 匹配第n个元素(如果订单没有改变)

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

    结尾的.doc
    soup.find('td', text=lambda text: text.endswith('.doc'))
    

答案 2 :(得分:-1)

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是td

的每个table class ="layout"标记中可用的文字列表

要删除空字符串,您可以执行以下操作:

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