Python 如何获得具有以下同级的下一个元素?

Python 如何获得具有以下同级的下一个元素?,python,selenium-webdriver,web-scraping,Python,Selenium Webdriver,Web Scraping,问题1:如何使用同一类单独的页面单击下一个div元素,刮去页面,返回并单击下一个div元素?由于所有元素都有相同的类名,并且包含一个指向我想要刮取的单独页面的唯一链接,因此问题就变成了我需要查找元素->转到页面->刮取信息->返回->转到下一个元素等等。已解决: 问题2:如何打印到CSV打印文本而不是xpath路径。请参阅下面使用的代码: from selenium import webdriver from selenium.webdriver.common.keys import Keys

问题1:如何使用同一类单独的页面单击下一个div元素,刮去页面,返回并单击下一个div元素?由于所有元素都有相同的类名,并且包含一个指向我想要刮取的单独页面的唯一链接,因此问题就变成了我需要查找元素->转到页面->刮取信息->返回->转到下一个元素等等。已解决:

问题2:如何打印到CSV打印文本而不是xpath路径。请参阅下面使用的代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from webdriver_manager.chrome import ChromeDriverManager

driver.get('https://www.example.com/list/')

# Loop load more in list
loadmore = True

while loadmore:
    try:
        next_link = driver.find_element_by_xpath('//button[@id="show-more"]')
        next_link.click()
    except NoSuchElementException:
        rows_remaining = False

# Open Csv file
File = open('list.csv', 'w')
writer = csv.writer(File)
entries = [] # defines entries
writer.writerows((entries))

# Collect all the elements
elements = driver.find_elements_by_css_selector("a[href*='/stockholm/']")

# Loop through each element to scrape
urls=[]
for element in elements:
    urls.append(element.get_attribute('href'))
    print(element.get_attribute('href')) # gets the href value of the element

# Define Xpath
def get_elements_by_xpath(driver, xpath):
    return [entry.text for entry in driver.find_elements_by_xpath(xpath)]

for url in urls:
    driver.get(url)
    facts = [
    ("//div[@class='fact' and contains(span, '')][1]"),
    ("//div[@class='fact' and contains(span, '')][2]"),]
    for name, xpath in facts:
        entries.append(get_elements_by_xpath(driver, xpath))
    writer.writerow(facts)
这是用于在单个页面上打印到CSV而不循环URL的代码:

facts = [
    ("//div[@class='fact' and contains(span, '')][1]"),
    ("//div[@class='fact' and contains(span, '')][2]"),]


with open('list.csv', 'a') as f:
    writer = csv.writer(f)
    entries = []
    for name, xpath in facts:
        entries.append(get_elements_by_xpath(driver, xpath))
    writer.writerows(zip(*entries))

您不必使用以下兄弟姐妹。可以使用返回列表的find_元素查找所有div。在这之后,您可以循环遍历每个元素并刮取您需要的内容

    # Collect all the elements
elements = driver.find_elements_by_css_selector("a[href*='/stockholm/']")

# Loop through each element to scrape
urls=[]
for element in elements:
    urls.append(element.get_attribute('href'))
    print(element.get_attribute('href')) # gets the href value of the element

# Define Xpath
def get_elements_by_xpath(driver, xpath):
    return [entry.text for entry in driver.find_elements_by_xpath(xpath)]

# Open Csv file
File = open('list.csv', 'w')
writer = csv.writer(File)

for url in urls:
    print(url) # Check if the url is correct
    driver.get(url)
    entries = [] # defines entries - Reset to blank after each loop
    facts = [
    ("//div[@class='fact' and contains(span, '')][1]"),
    ("//div[@class='fact' and contains(span, '')][2]"),]
    for xpath in facts:
        entries.append(get_elements_by_xpath(driver, xpath))
    print(entries) #Check what you are writing into csv file before writing
    writer.writerow(entries)

谢谢,但我现在发现我遗漏了一个细节:每个元素都包含一个指向唯一页面的链接。在那一页上是我想搜集的信息。问题是我需要找到元素->转到页面->刮取信息->返回->转到下一个元素等等。为此,据我所知,必须采用以下同级方式?来回导航可能会导致过时的元素异常。相反,你可以画出所有的URL并在其中循环-见更新的答案。这真是太棒了。荣誉-它比我预期的要好,这正是我想要的!这也拓宽了我对如何进一步应用这项技术的看法。太感谢你了!我还有最后一个问题要问你,在url中的url:在Scrape下你需要什么:我如何将数据直接写入CSV文件?按照我的原始脚本设计的方式进行操作实际上并不可行,因为这是一个for循环,我假设我需要执行一个嵌套循环,其中检索数据的第一个是driver.geturl,而第二个是open'name.csv',a'as f:等等。我试着做一个嵌套循环,但在扫描完所有URL后,如果我使用with open,它既不能使用with open,也不能检索任何数据。我觉得有什么遗漏,请参阅更新的答案。在使用循环和writerow方法将项目写入csv文件之前,可以打开csv文件。是否应该将条目写入csv而不是事实?writer.writerowentry?我试过了,但它什么也印不出来。当把事实放入writerows时,我得到了正确打印的事实路径,这是一半。当我使用with open进行此设置时,它可以工作,但是writer.writerows有zip*条目,而不仅仅是条目。这里可能有点头疼,因为最初的open只包含复数writeroW,而新代码是单数writeroW。无法理解这一点:@Sureshmani我只从一页打印到CSV时添加了原始代码。也许这有助于理解其中的逻辑。正如您所看到的,在条目=[]和写入CSV之前会显示事实。也许这需要一个嵌套的循环?我认为名称是这个“for”循环的无效参数-请参阅我的更新answer@Sureshmani很抱歉迟了回复,我尝试了这个。出于某种原因,它不会将任何内容打印到我的csv文件中,它会创建一个空文件,但在终端窗口中,它会显示使用printentries打印的内容。我使用了完全相同的代码,html源代码没有更改,所以不可能是它。