Как игнорировать ссылки, которые находятся в скобках? - PullRequest
5 голосов
/ 01 апреля 2019

У меня есть задача доказать, что большинство страниц википедии ведут к странице "Философия", когда вы продолжаете нажимать первую ссылку.

Я создал код, который находит первую ссылку с помощью xpath, но проблема в том, что я должен игнорировать ссылки, помещенные в круглые скобки.

Например, в тексте (ссылки выделены жирным шрифтом): Семиоз (от Греческий : σημείωσις, sēmeíōsis, производное от глагола σημειῶ, sēmeiô, «to mark») - это любая форма активности ...

Первая ссылка в этом 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 голосов
/ 01 апреля 2019

Это намного сложнее, чем я изначально думал.Проблема в том, что вы можете найти элементы на странице, используя Selenium, но вы не можете увидеть текстовый контекст этого элемента, например, находится ли эта ссылка внутри () s.Вот где это становится сложнее.Если вы смотрите на все как на элементы, вы не можете видеть контекст (вы не можете видеть, какие элементы находятся внутри других элементов).Если вы посмотрите на все как текст (получите .text от родителя), вы больше не сможете видеть, что такое ссылка).Единственный способ, которым я мог придумать, это сделать:

  1. Получить родительский элемент, который содержит первый абзац
  2. Используйте .get_attribute("innerHTML"), чтобы получить HTML, содержащийся в этом элементе
  3. Поиск ссылки, которая не находится внутри () s с регулярным выражением

Проблема в том, что, как только вы обнаружите это, у вас есть строка тега 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, который не находится внутри () s.Оттуда подход зависит от вас.Вы можете восстановить URL-адрес, проанализировав атрибут href и добавив его к основному URL-адресу, например

new_url = "https://en.wikipedia.org" + href

, или перейдите в другом направлении.Выбор за вами и вашими требованиями, но этого должно быть достаточно, чтобы начать работу.

0 голосов
/ 01 апреля 2019

Вот ваш код. Используйте следующий брат, чтобы получить следующий дочерний элемент.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...