XPath для парсинга электронной почты с использованием селена - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно очистить несколько страниц контактов для адресов электронной почты в python, используя селен. Все они различаются по своему макету и структуре сайта, поэтому мне пришлось придумать очень динамичный c XPATH-шаблон для поиска адресов.

Дополнительным препятствием является то, что адреса иногда представляют собой обычный текст, а иногда href mailto:

Шаблон, который у меня до сих пор вроде работает:

email = driver.find_elements_by_xpath("//*[text()[contains(.,'@')]]").text

Но это действительно не работает, если несколько данных хранятся в одном div Он также возвращает список элементов, но мне нужно только электронное письмо. Если я использую find_element_by_xpath, текста нет вообще.

Примером может быть попытка очистить этот сайт: http://schandorf.at/service/kontakt/

Итак, если у вас есть какие-нибудь советы, дайте мне знать!

1 Ответ

1 голос
/ 31 мая 2020

Для каждой из ваших страниц вы можете попробовать что-то вроде этого (пример с веб-сайтом, который вы разместили):

emailA = driver.find_elements_by_xpath("//div[@id='col3']//p[contains(.,'@')]").text
emailA_fix = re.search('E-Mail: (.+?)[A-Z]',value).group(1)
emailB = driver.find_elements_by_xpath("//a[contains(@href,'mailto:')]").get_attribute("href")

email = emailA_fix + emailB

emailA = поиск адреса электронной почты в текстовом формате; email B = поиск адреса электронной почты в формате mailto

С emailA мы используем регулярное выражение (re.search) для извлечения адреса электронной почты.

Вывод: post@schandorf.bgld.gv.at

С L XML или Scrapy вы можете использовать одно выражение XPath для поддержки нескольких структур ваших страниц:

 //div[@id='col3']//text()[contains(.,'Mail')]|//a[contains(@href,"mailto:")]/@href
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...