循环div标题并为每个标题标签检索li标签

时间:2018-09-21 23:11:46

标签: python html selenium web-scraping selenium-chromedriver

我正在尝试抓取使用JS对象的网页。

我在Python环境中使用Selenium;我使用硒来加载所需的内容,即“ VIEW SELECT TV PACKAGE DETAILS”文本,该文本会启动模式容器。

enter image description here

在此容器中,有包装标题,其下方有通道。我试图遍历每个标题,并获取每个标题中的频道名称。

这是webpage

这是我的代码,可以帮助您导航到我要抓取的容器:

from selenium import webdriver
import pandas as pd


url = "https://www.rogers.com/consumer/tv#/packages"

#create a new Chrome session
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get(url)

#change the province to Ontario
province_button = driver.find_element_by_class_name("dropdown-toggle")
province_button.click() #clicks dropdown
province_button = driver.find_element_by_link_text("Ontario")
province_button.click() #clicks dropdown

#visit TV portal page, re-init url again
driver.get(url)


#####BEGIN SCRAPING PACKAGE INFO#####

#open Select Package window 
package_button = driver.find_element_by_class_name("Package-details")
package_button.click() #clicks dropdown

package_data = driver.find_elements_by_class_name("Package-channels")

package_data var返回我所有的标题和频道名称;但不能说明哪些字符串是标题,哪些是通道。我知道我可以编写一些复杂的正则表达式来解决问题,但我希望有一种动态的方法。任何建议表示赞赏。谢谢!

******已编辑*******

下面的每个注释,下面是将WebElements放入变量而不是输出到控制台的代码:

select_package_data = [] 

headingsCount = len(driver.find_elements_by_xpath("//div[@class='modal- 
content']//*[contains(@class,'Package-channels--heading ng-binding')]"))

for index in range(headingsCount):
    head = driver.find_element_by_xpath("//div[@class='modal-content']//* 
    [contains(@class,'Package-channels--heading ng-binding')] 
    [index]".replace('index',str(index+1)))

    select_package_data.append(head.text)

    channelsPerheading = driver.find_elements_by_xpath("(//div[@class='modal- 
    content']//ul[@ng-if='vm.channels'])[index]/li[not 
    (contains(@class,'Package-channels--heading ng- 
    binding'))]".replace('index',str(index+1)))

    temp_list=[]

for channel in channelsPerheading:
    temp_list.append(channel.text.encode('utf-8'))
select_package_data.insert((index+1), temp_list[:])`

*********每条评论的V2版本:*********

最终代码需要在xpath方法中添加括号;我相信这是由于将x {x1}}分配给变量时附加在实际xpath的末尾:

[index]

1 个答案:

答案 0 :(得分:1)

获取模态窗口中所有标题和通道的最简单方法是使用以下xpath。另外,以下xpath是动态的,并且未进行硬编码。即使将来添加了新的频道或标题,这些xpath仍然可以使用。

headings = driver.find_elements_by_xpath("//div[@class='modal-content']//*[contains(@class,'Package-channels--heading ng-binding')]")
print('all headings: '+str(len(headings)))

channels= driver.find_elements_by_xpath("//div[@class='modal-content']//a[contains(@class,'PackageChannelImage')]")
print('all channels: '+str(len(channels)))

输出:

all headings: 17
all channels: 243

您可以使用以下方法来获取每个标题的频道并进行打印。

headingsCount = len(driver.find_elements_by_xpath("//div[@class='modal-content']//*[contains(@class,'Package-channels--heading ng-binding')]"))

for index in range(headingsCount):
    print('For heading: '+ driver.find_element_by_xpath("(//div[@class='modal-content']//*[contains(@class,'Package-channels--heading ng-binding')])[index]".replace('index',str(index+1))).text+', Channels are:')
    channelsPerheading = driver.find_elements_by_xpath("(//div[@class='modal-content']//ul[@ng-if='vm.channels'])[index]/li[not (contains(@class,'Package-channels--heading ng-binding'))]".replace('index',str(index+1)))
    for channel in channelsPerheading:
        print(channel.text.encode('utf-8').strip())

我已粘贴输出here