Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как отличить ссылку на файл от ссылки на веб-страницу

selenium
webdriver
Теги: #<Tag:0x00007f7b70a9b210> #<Tag:0x00007f7b70a9b0a8>

(Ddos1) #1

Webdriver + python
Здравствуйте! Я в этой теме новичок и прошу помощи.
Задача состоит в следующем:
На сайте мне нужно отобрать все ссылки которые перенаправляют на другую веб-страницу и произвести над ними определенные действия. Делаю я это с помощью driver.find_elements_by_tag_name("a"). но на сайте есть также ссылки на файлы (*.doc, *.xls, *.pdf и т.д.) Вопрос в том как мне отделить ссылки на файл от обычных ссылок?
Я пытаюсь решить эту проблему следующим образом - вытаскивать атрибуты “href” и проверять строку на наличие символов “.doc”, “.xls”, “.pdf” и т.д. но это как-то громоздко и не очень удобно.
Может кто знает как это решить средствами Webdriver или JavaScript? или может кто-то предложит более “элегантный” способ?


(Ray Romanov) #2

Гляньте сюда:


(Stan) #3

или через css selectors

findElements(By.cssSelector("a[href*=.doc]"));

(Ddos1) #4

Спасибо. Я воспользуюсь связкой “not contains” мне xpth более ближе. Это будет удобнее чем все ссылки перебирать))) Но все же не очень удобно прописывать все расширения файлов.


(Ray Romanov) #5

через and можно сборное условие сделать:
.//a[not(contains(@href, ".png")) and not(contains(@href, ".jpg")) and not(contains(@href, ".gif")))]


(Ddos1) #8

Пока что нашел такой вариант через библиотеку на питон urllib3:

import urllib3 http = urllib3.PoolManager() res = http.urlopen("GET","https://pypi.python.org/pypi/urllib3/1.12") typ = res.headers['Content-Type']

Если переменная typ возвращает text/html то значить это веб-страница, если что-то другое то пропускаем.


(Odynplus) #9

В css3 :not есть, и поиск в конце через $= : By.cssSelector(“a:not([href$=’.doc’]:not([href$=’.xls’])”)

http://www.w3schools.com/cssref/css_selectors.asp


(Artur Korobeynyk) #10

Мысль правильная, решение правильное (лучше чем по расширению файла парсить). Но маймов для текста существует больше: http://www.freeformatter.com/mime-types-list.html
У мсдн есть упрощенный список https://msdn.microsoft.com/en-us/library/ms526971(v=exchg.10).aspx


(Ddos1) #11

Спасибо, полезная вещь, в будущем думаю пригодиться. А в текущей задаче мне будет достаточно text/html. т.к. насколько я понял все *.htm, *.html, *.php возвращают именно text/html.


(Stan) #12

Нет, зависит от настроек сервера.


(Ddos1) #13

То есть при определенных настройках сервера, Content-Type у файла *.html может быть не равен “text/html”?


(Stan) #14

Да, любое расширение можно отдать клиенту с каким угодно content type.


(Ddos1) #15

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