在寻找艰难的网站来读取数据时,我在下面找到了一个很好的案例研究。我已经使用蛮力和不雅的解决方案解决了它。但是,我确信它们是从该页面(BoxBg1元素)解构表的一种优雅方法。
我可以使用页面的各个x路径获取表的每个元素:https://www.moneycontrol.com/financials/3mindia/balance-sheetVI/MI42
例如,2018年3月的“储备金和盈余”为 '/ html / body / div [2] / div [3] / div [2] / div [3] / div [2] / div [2] / div [2] / div [1] / table [2] / tbody / tr [9] / td [3]'
可以使用代码轻松提取值:
driver = webdriver.Firefox()
driver.get('https://www.moneycontrol.com/financials/3mindia/balance-sheetVI/MI42')
trial_xpath ='/html/body/div[2]/div[3]/div[2]/div[3]/div[2]/div[2]/div[2]/div[1]/table[2]/tbody/tr[9]/td[3]'
print(driver.find_element_by_xpath(trial_xpath).text)
同样,我已经获得了所有元素。但是,如何使用较大的元素xpath或css_selector等巧妙地获取表
该表的xpath为:'// [contains(concat(“”,@class,“”),concat(“”,“ boxBg1”,“”)))] | // [contains(concat(“”,@class,“”),concat(“”,“ hed”,“”))]'
如果“粗体”文本不可检索,那是很好的,它们是从表数据本身的其余部分派生的。
我也尝试过使用find_elements_by_xpath('.// tr')进行循环,如以下代码中所述。 las,它没有用,并且在python控制台中生成了无效的错误。
Whole_table_xpath = '//*[contains(concat( " ", @class, " " ), concat( " ", "boxBg1", " " ))] | //*[contains(concat( " ", @class, " " ), concat( " ", "hed", " " ))]'
Whole_table_element = driver.find_element_by_xpath(Whole_table_xpath)
for i in Whole_table_element.find_elements_by_xpath('.//tr'):
print(driver.find_element_by_xpath(i).text)
print(driver.find_element_by_xpath(i).get_attribute("value"))