我正在尝试抓取使用JS对象的网页。
我在Python环境中使用Selenium;我使用硒来加载所需的内容,即“ VIEW SELECT TV PACKAGE DETAILS”文本,该文本会启动模式容器。
在此容器中,有包装标题,其下方有通道。我试图遍历每个标题,并获取每个标题中的频道名称。
这是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]
答案 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