我正在使用Python + Selenium从列出公司信息的网站上抓取数据。
对于每个公司,我需要2个数据点-电子邮件和url。
问题是-对于某些公司,没有显示电子邮件,并且如果我分别获得URL和电子邮件列表,我将无法匹配该对(电子邮件列表将比URL列表短,我将'不知道哪些电子邮件丢失了。
因此,我想也许有一种方法可以获取每个公司块的根元素(例如,它是带有“ provider”类的div),然后在每个内部搜索电子邮件和url。
有可能吗?如果可以,怎么办?
答案 0 :(得分:1)
有两种方法可以实现。
第一:只需使用选择器在该“ div”元素的子元素中查找该元素。您可以使用find_elements函数先检查有多少个父“ div”,然后循环很多次。不建议使用此方法。
第二:您可以在Webelement对象上调用find_element函数族。
假设我正在this网站上工作。
### First method:
FirstTitleInDiv = driver.find_element_by_css_selector(".row.test-site:nth-of-type(1) h2") # get first title
SecondTitleInDiv = driver.find_element_by_css_selector(".row.test-site:nth-of-type(2) h2") # get second title
# ... and so on.
### Second method:
Div_Els = driver.find_elements_by_css_selector(".row.test-site") # get list of all divs
# You can now loop through all divs in order to do following:
FirstTitleInDiv = Div_Els[0].find_element_by_css_selector("h2") # get first title
SecondTitleInDiv = Div_Els[1].find_element_by_css_selector("h2") # get second title
# ... and so on.
答案 1 :(得分:1)
这是完整的逻辑。
url = "https://clutch.co/web-designers?page=0"
driver.get(url)
pros = driver.find_elements_by_css_selector("li.provider-row")
providers =[]
for provider in pros:
pUrl = provider.find_element_by_css_selector(".website-link.website-link-a a").get_attribute("realurl")
if (len(provider.find_elements_by_css_selector(".contact-dropdown .item a"))>0):
pEmail = provider.find_element_by_css_selector(".contact-dropdown .item a").get_attribute('textContent')
else:
pEmail=''
providers.append("{" + pUrl + "," + pEmail + "}")
print(providers)
答案 2 :(得分:0)
好,我找到了解决方法。
首先,您收集需要获取字段的所有块。示例:
providers = browser.find_elements_by_class_name('provider-row')
然后将find_elements_by_xpath()方法与以“ .//”开头的定位符一起使用,这意味着在特定元素内进行搜索。示例:
providers[0].find_elements_by_xpath(".//li[@class='website-link website-link-a']/a[@class='sl-ext']")