使用selenium时,我一直面临一个重大问题:
在Trivago网站" https://www.trivago.com/site_map",我一直试图让脚本点击每个大陆,但它似乎不起作用:
element = driver.find_element_by_class_name('link')
element.click()
我还尝试使用以下xpath:
//*[@id="js_sitemap"]/div/div/ul/li[1]/a
任何人都可以帮我一把吗?
答案 0 :(得分:1)
您在尝试点击li
节点时需要处理子链接:
driver.find_element_by_css_selector('li.link>a').click()
但是如果你想打开每个大陆的页面,你最好得到参考文献清单并获得每个参考文献:
links = [link.get_attribute('href') for link in driver.find_elements_by_css_selector('li.link>a')]
for link in links:
driver.get(link)
# do something with continent
答案 1 :(得分:1)
正如@DyZ指出的那样,您只需使用页面上提供的网址(例如'https://www.trivago.com/north-america-34225/hotel'
)来抓取列表。但是,您可以迭代find_elements_by_tag_name
并为每个对象引用调用click
方法:
from selenium import webdriver
d = webdriver.Chrome('/Users/jamespetullo/Downloads/chromedriver')
d.get('https://www.trivago.com/site_map')
for continent in d.find_elements_by_tag_name('a'):
if continent.text in [u'Africa', u'Asia', u'Australia & Oceania', u'Central and South America', u'Europe', u'North America']:
continent.click()
#do something with page source or current page object
d.back()
或者,要查找链接,您可以使用bs4
和urllib
:
from bs4 import BeautifulSoup as soup
import urllib
import re
data = str(urllib.urlopen('https://www.trivago.com/site_map').read())
links = [i.text for i in soup(data, 'lxml').find_all('a', href=True) if re.findall('[a-zA-Z\-]+\-\d+/hotel', i['href'])]
输出:
[u'Africa', u'Asia', u'Australia & Oceania', u'Central and South America', u'Europe', u'North America']