Как извлечь атрибут href после определенного th в информационном блоке википедии через Selenium или lxml, используя Python - PullRequest
0 голосов
/ 17 февраля 2019

Проблема, которую я имею, состоит в том, чтобы получить ссылку на конкретную ячейку в инфобоксе на вики-странице (см. Изображение ниже).В частности, я хотел бы получить ссылку на официальный сайт 3M после заголовка строки таблицы «Веб-сайт».Исходный код выделен на картинке.(Этот формат вики-страниц довольно обычный для вики-страниц большинства фирм. Я также планирую получить веб-сайты для многих фирм, так что это не просто собирать эту ..)

Вещи, которые я пробовал, но неt work:

# selenium:
driver.find_element_by_xpath("//table[@class='infoboxvcard']/tr[th/text()='Website']").get_attribute("href") 
# lxml:
url = "https://en.wikipedia.org/wiki/3M"
req = requests.get(url)
store = etree.fromstring(req.text)
output = store.xpath("//table[@class='infobox vcard']/tr[th/text()='Website']/td")

Код, который работает для конкретной фирмы:

driver.get("https://en.wikipedia.org/wiki/3M")
website = driver.find_element_by_xpath("//*[@id='mw-content-text']/div/table[2]/tbody/tr[17]/td/span/a").get_attribute("href")

Однако, поскольку не все фирмы имеют одинаковое количество строк, этот код не будет работать при циклеболее ста фирм.

Любая помощь будет оценена!Заранее спасибо!

https://en.wikipedia.org/wiki/3M

Снимок экрана со страницы вики на 3 м:

screenshot from 3m wiki page

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Что вы можете сделать, вы можете сохранить весь link_text в листе Excel, извлечь строку из Excel и назначить переменную, как я назначил для примера. Затем используйте мой код ниже, это должно работать.

wb_link_text="3M.com"
wb_ele_href =driver.find_element_by_xpath("//a[text()[contains(.,'" + wb_link_text +"')]]").get_attribute("href")
print(wb_ele_href)

Дайте мне знать, если это поможет.

0 голосов
/ 17 февраля 2019

Для извлечения атрибута href на официальном сайте 3M из википедии Selenium будет достаточно, и вам нужно вызвать WebDriverWait длянужный элемент должен быть видимым, и вы можете использовать следующее решение:

website = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//th[@scope='row' and text()='Website']//following::td[1]/span/a[@class='external text']"))).get_attribute("href")

Примечание : необходимо добавить следующие операции импорта:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 17 февраля 2019

Это более надежный xpath:

website = driver.find_element_by_xpath('//*[@class="url"]/a').get_attribute("href")

Если вы знаете текст, который можете использовать:

website = driver.find_element_by_link_text('3M.com').get_attribute("href")

Надеюсь, это поможет вам!

...