我发现了几篇关于如何做到这一点的文章,但我对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'?谢谢大家提前花时间帮忙!
答案 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)
很好......从我看到的情况来看,没有太多选择。所以这是我的尝试:
匹配第n个元素(如果订单没有改变)
soup.findAll('td')[42]
匹配以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 == '')]