Python Selenium在迭代表时只获得第一行

时间:2018-02-15 16:45:10

标签: python selenium html-table

我正在尝试从以下新闻网站中提取最新的头条新闻: http://news.sina.com.cn/hotnews/

#save ids of relevant buttons that need to be clicked on the site
buttons_ids = ['Tab21' , 'Tab22', 'Tab32']

#save ids of relevant subsections
con_ids = ['Con11']

#start webdriver, go to site, hover over buttons
driver = webdriver.Chrome()
driver.get("http://news.sina.com.cn/hotnews/")
time.sleep(3)
for button_id in buttons_ids:
    button = driver.find_element_by_id(button_id)
    ActionChains(driver).move_to_element(button).perform()

然后我遍历我感兴趣的每个部分以及每个部分中的所有标题,这些标题都是HTML表格中的行。但是,在每次迭代时,它都会返回第一个元素

for con_id in con_ids:
    for news_id in range(2,10):
        print(news_id)
        headline = driver.find_element_by_xpath("//div[@id='"+con_id+"']/table/tbody/tr["+str(news_id)+"]")
        text = headline.find_element_by_xpath("//td[2]/a")
        print(text.get_attribute("innerText"))
        print(text.get_attribute("href"))
        com_no = comment.find_element_by_xpath("//td[3]/a")
        print(com_no.get_attribute("innerText"))

我还尝试了以下方法,基本上将表保存为列表,然后遍历行:

for con_id in con_ids:
    table = driver.find_elements_by_xpath("//div[@id='"+con_id+"']/table/tbody/tr")
    for headline in table:
        text = headline.find_element_by_xpath("//td[2]/a")
        print(text.get_attribute("innerText"))
        print(text.get_attribute("href"))
        com_no = comment.find_element_by_xpath("//td[3]/a")
        print(com_no.get_attribute("innerText"))

在第二种情况下,我得到了该部分中的标题数量,因此它显然正确地获取了行数。但是,它仍然只返回所有迭代的第一行。我哪里错了?我知道这里有一个类似的问题:Selenium Python iterate over a table of rows it is stopping at the first row但我仍然无法弄清楚我哪里出错了。

3 个答案:

答案 0 :(得分:3)

在XPath中,以//开头的查询将相对于文档根进行搜索;所以,即使您在正确的容器元素上调用find_element_by_xpath(),您也要突破该范围,从而执行相同的全局搜索并每次产生相同的结果。

要将查询限制为当前元素的后代,请使用.//开始查询,例如:

text = headline.find_element_by_xpath(".//td[2]/a")

答案 1 :(得分:1)

试试这个:

var today = new Date();
var day = today.getDay();
var daylist = ["Sunday","Monday","Tuesday","Wednesday 
","Thursday","Friday","Saturday"];
       console.log("Today is : " + daylist[day] + ".");
        var hour = today.getHours();
        var minute = today.getMinutes();
        var second = today.getSeconds();
        var prepand = (hour >= 12)? " PM ":" AM ";
        hour = (hour >= 12)? hour - 12: hour;

if (hour===0 && prepand===' PM ') 
{    
   if (minute===0 && second===0)
   {  
      hour=12;
      prepand=' Noon';
   }  
   else
   {  
      hour=12;
      prepand=' PM';
   }  
}

if (hour===0 && prepand===' AM ') 
{    
   if (minute===0 && second===0)
   {  
      hour=12;
      prepand=' Midnight';
   }  
   else
   {  
      hour=12;
      prepand=' AM';
   }  
}  

console.log("Current Time : "+hour + prepand + " : " + minute + " : " + second);

我能够通过上面的代码

获得头条新闻

答案 2 :(得分:0)

我能够通过一次性指定整个XPath来解决它:

headline = driver.find_element_by_xpath("(//*[@id='"+con_id+"']/table/tbody/tr["+str(news_id)+"]/td[2]/a)")
print(headline.get_attribute("innerText"))
print(headline.get_attribute("href"))

而不是将其分为两部分。 我唯一解释为什么它只重复打印第一行的原因是有一些奇怪的Javascript在工作时不能让你在分割请求时正确迭代。 或者我的第一个版本有语法错误,我不知道。 如果有人有更好的解释,我很高兴听到它!