Python 如何忽略位于括号中的链接?

Python 如何忽略位于括号中的链接?,python,selenium,Python,Selenium,我有一个任务要证明,当你不断点击第一个链接时,大多数维基百科页面都会指向一个“哲学”页面 我创建了一个使用xpath查找第一个链接的代码,但问题是我应该忽略放在括号内的链接 例如,文本(粗体链接): Semiosis(来自希腊语:σημείωσει,sēmeí333; sis,动词σημε的派生词)ῶ, sēmeiô,“标记”)是任何形式的活动 这个div中的第一个链接是“希腊语”,但这会让我陷入一个循环,所以我想过滤掉它,然后单击括号后面的第一个链接。在本例中为“活动” 有没有办法忽略括号中的

我有一个任务要证明,当你不断点击第一个链接时,大多数维基百科页面都会指向一个“哲学”页面

我创建了一个使用xpath查找第一个链接的代码,但问题是我应该忽略放在括号内的链接

例如,文本(粗体链接): Semiosis(来自希腊语:σημείωσει,sēmeí333; sis,动词σημε的派生词)ῶ, sēmeiô,“标记”)是任何形式的活动

这个div中的第一个链接是“希腊语”,但这会让我陷入一个循环,所以我想过滤掉它,然后单击括号后面的第一个链接。在本例中为“活动”

有没有办法忽略括号中的链接

start_page = "https://en.wikipedia.org/wiki/Special:Random"

def click_link():
    link = driver.find_element_by_xpath("//div[@class='mw-parser-output']/p/a")
    link.click()    

driver.get(start_page)

redirects = 0

title = driver.find_element_by_tag_name("title").text

while title != "Philosophy":
    click_link()
    redirects += 1
    title = driver.find_element_by_tag_name("title").text

print(redirects)

这是您的代码。使用以下同级获取下一个子项

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium import webdriver

def click_link():
    wait=WebDriverWait(driver,5)

    element = wait.until(expected_conditions.element_to_be_clickable((By.XPATH, "//div[@class='mw-parser-output']/p/a[1]/following-sibling::a")))
    element.click()

driver = webdriver.Chrome()
driver.get("https://en.wikipedia.org/wiki/Special:Random")
title=driver.title


redirects=0
while title != "Action (philosophy) - Wikipedia":
    click_link()
    redirects += 1
    title =driver.title
    print(title)

print(redirects)

这比我最初想象的要复杂得多。问题是,您可以使用Selenium在页面上定位元素,但实际上看不到该元素的文本上下文,例如,该链接是否在
()
s中。这就是它变得更加困难的地方。如果将所有内容都视为元素,则无法查看上下文(无法查看其他元素中的元素)。如果将所有内容视为文本(从父级获取
.text
),则无法再看到什么是链接)。我能想到的唯一方法是:

  • 获取包含第一段的父元素
  • 使用
    .get_属性(“innerHTML”)
    获取该元素中包含的HTML
  • 使用正则表达式搜索不在
    ()
    s中的链接
  • 问题是,一旦您找到它,您就拥有了
    A
    标记的字符串,而不是可以单击的实际元素。有了这些文字,你可以做一些事情

  • 获取找到的链接的文本,并使用定位器在页面上查找(以便您可以单击它),但这并不保证它是正确的链接,例如,想象页面上有多个指向“希腊”的链接,等等

  • 另一个选项是查看找到的
    A
    标记的
    href
    ,然后重新构建可以导航到的URL

  • 这里有一些代码可以让你朝着正确的方向前进。你必须决定从这里走哪条路

    import re
    ...
    start_page = "https://en.wikipedia.org/wiki/Special:Random"
    driver.get(start_page)
    first_para = driver.find_element_by_css_selector("#mw-content-text > div > p")
    text = first_para.text
    regex = "(<a .*?<\/a>)|\(.*?\)"
    matches = re.findall(regex, text)
    print(matches[1])
    

    或者换个方向。选择取决于您和您的要求,但这应该足以让您开始。

    到目前为止,您尝试了什么?请将您的代码添加到您的问题中。这比乍一看要复杂得多。如果不解析页面中的HTML,您将无法完成此操作,这将非常复杂。谢谢。虽然这不是我想要的解决方案。问题是括号中的链接可能不同(希腊语、拉丁语等)。因为我是从一个随机页面开始的,所以我需要弄清楚如何完全跳过括号内的链接,然后单击括号外的第一个链接。@Chromec:我已经更新了答案。请检查并让我知道。您还没有确定链接是否在括号内。谢谢,您的解决方案似乎有效。我得到了广告建议,诀窍在于正确的xpath搜索……如果这一点或任何其他答案有用,请投票表决。一旦找到问题的答案,请将其标记为已接受,这样问题就不会没有答案。
    new_url = "https://en.wikipedia.org" + href