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'
好吧好吧...据我所知,没有太多选择。所以这是我的尝试:
匹配第n个元素(如果顺序不变)
soup.findAll('td')[42]
匹配以 .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 == '')]
我找到了几篇关于如何执行此操作的文章,但我对 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'
好吧好吧...据我所知,没有太多选择。所以这是我的尝试:
匹配第n个元素(如果顺序不变)
soup.findAll('td')[42]
匹配以
结尾的.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 == '')]