如何忽略括号中的链接?

时间:2019-04-01 09:27:32

标签: python selenium

我有一个任务来证明,当您继续单击第一个链接时,大多数Wikipedia页面都导致进入“哲学”页面。

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

例如,以文本显示(粗体链接): 符号学(来自希腊:σημείωσις,sēmeíō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)

2 个答案:

答案 0 :(得分:0)

这是您的代码。使用跟随兄弟获取下一个子项。

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)

答案 1 :(得分:0)

这比我最初想象的要复杂得多。问题是您可以使用Selenium在页面上找到元素,但实际上看不到该元素的文本上下文,例如该链接是否在()内。这是越来越困难的地方。如果将所有内容都视为元素,则看不到上下文(看不到其他元素中包含哪些元素)。如果您将所有内容都视为文本(从父级那里获取.text,那么您将不再看到什么是链接)。我唯一想到的方法是:

  1. 获取包含第一段的父元素
  2. 使用.get_attribute("innerHTML")获取该元素中包含的HTML
  3. 使用正则表达式搜索()内的链接

问题在于,一旦找到该字符串,便拥有A标签的字符串,而没有可单击的实际元素。使用该文字,您可以做几件事...

  1. 获取找到的链接的文本,然后使用定位符在页面上找到该链接(因此您可以单击它),但这不能保证它是正确的链接,例如想象页面上有多个指向“希腊”的链接,等等。

  2. 另一种选择是查看找到的href标签的A,然后重新构建可以导航到的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])

这将打印<a href="/wiki/Action_(philosophy)" title="Action (philosophy)">activity</a>,这是不在A内的第一个()标签。从那里开始,方法取决于您。您可以通过解析href属性并将其附加到主URL(如

)来重建URL
new_url = "https://en.wikipedia.org" + href

或选择不同的方向。选择取决于您和您的要求,但这足以使您入门。