使用Selenium

时间:2018-01-21 06:30:50

标签: python html selenium web-scraping

我正在废弃以下页面:https://proximity.niceic.com/mainform.aspx

首先,请在国家/地区文本框中输入'%%'以显示该区域内的所有承包商。一旦我进入,如果我检查devtools中的HTML,我得到以下内容:

Chrome Devtools

我想从所选表格中提取所有信息。问题是,当我使用硒废弃它时,我确实找到了桌子,但我无法访问它的身体或孩子。

这是我的python代码:

main_table = driver.find_elements_by_tag_name('table')
outer_table = main_table[3].find_element_by_tag_name('table')
print outer_table.get_attribute('innerHTML')

上面的代码输出以下内容:

<table cellspacing="0" rules="all" bordercolor="Silver" border="1" id="dvContractorDetail" style="background-color:White;border-color:Silver;border-width:1px;border-style:Solid;height:200px;width:400px;border-collapse:collapse;">

</table>

正如你所看到的,我只能得到表格标签,但它的组件都不像tbody或tbody标签中的所有tr标签

我该怎么办?

1 个答案:

答案 0 :(得分:2)

这里发生的是在页面加载后表格通过JS加载。你必须等到表加载。为此,您必须使用Waits指定here中的任何一个。

我建议使用Explicit Wait。你可以这样做:

首先,您需要添加以下导入。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

然后改变

main_table = driver.find_elements_by_tag_name('table')
outer_table = main_table[3].find_element_by_tag_name('table')
print outer_table.get_attribute('innerHTML') 

try:
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'gvContractors')))
except TimeoutException:
    pass  # Handle the exception here
table = driver.find_element_by_id('gvContractors').get_attribute('innerHTML')
print(table)

它会为您提供所需的输出。我不是在这里发布输出,因为它太大了,但你可以通过这样做验证它

print('Company/Address' in table)

打印True

注意:
您可以直接使用_by_tag_name查找所需的表格,而不是使用_by_id逐个查找表格。 (此处表格有id="gvContractors"