我需要获取HTML表格数据作为列表。该表有100列和50行。并非每个<td>
都有文本值,并且每一行都与其他行不同(不同列中没有文本值)
因此,当我使用row.text
时,它将返回一个列表,而忽略没有文本的列表。每行的列表都有不同的长度。这不适用于将列表写入excel文件。
如果我这样做的话,<td>
一<td>
一一地形成一个列表。这太慢了。
for row in driver.find_elements(By.XPATH, '//table[@id="mytable"]/tbody/tr')
print(row.text)
html
<table id='mytable'>
<tbody>
<tr>
<td>abc</td>
<td></td>
<td><a href='javascript:...'>cbd</a></td>
</tr>
<tr>
<td>ttt</td>
<td>bbb</td>
<td></td>
</tr>
<tbody>
</table>
使用BeautifulSoup
from bs4 import BeautifulSoup
soup = BeautitulSoup(driver.find_element(By.XPATH, '//table[@id="mytable"]/tbody').get_attribute('innerHTML'), features='lxml')
for tr in soup.find_all('tr'):
list = ([text for text in tr.strings])
print(list)
我仍然得到像['abc','cbd']这样的列表,我需要得到像['abc','','cbd']一样的列表
答案 0 :(得分:0)
您可以使用Selenium来获取整个表格,然后使用Beautiful Soup对其进行解析:
from bs4 import BeautifulSoup
html_table = driver.find_elements(By.XPATH, '//table[@id="mytable"]')
soup = BeautifulSoup(html_table)
# This is a fast way to get a list of all the <td> tags, even the empty ones:
td_list = soup('td')
然后从那里可以将td标记写入excel文件。
但是根据您的情况,我可能只使用请求库而不是硒来获取整个页面的HTML,然后使用Beautiful Soup来获取表,然后从那里解析td标签。
答案 1 :(得分:0)
感谢gbergeson。我终于找到了使用beautifulsoup的方式,而不是跳过空文本。
from bs4 import BeautifulSoup
soup = BeautitulSoup(driver.find_element(By.XPATH, '//table[@id="mytable"]/tbody').get_attribute('innerHTML'), features='lxml')
for tr in soup.find_all('tr'):
l = (td.get_text() for td in tr.find_all('td'))
print(l)