t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f748a4de8c8> #<Tag:0x00007f748a4de800>

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

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

1 Симпатия

или через css selectors

findElements(By.cssSelector("a[href*=.doc]"));
1 Симпатия

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

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

1 Симпатия

Пока что нашел такой вариант через библиотеку на питон 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 то значить это веб-страница, если что-то другое то пропускаем.

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

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

1 Симпатия

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

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

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

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

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

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