我正在尝试从以下新闻网站中提取最新的头条新闻: 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但我仍然无法弄清楚我哪里出错了。
答案 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在工作时不能让你在分割请求时正确迭代。 或者我的第一个版本有语法错误,我不知道。 如果有人有更好的解释,我很高兴听到它!