Как получить все теги "a", содержащие определенный формат "href", используя Python? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь получить все ссылки с веб-сайта, используя XPATH, формат URL довольно специфичен, но динамичен.

URL-адрес, который я хотел бы получить, имеет формат "/ static_word / random-string-with-dashes / random_number" (3 сегмента: 1-я статическая, 2-я случайная строка, 3-е случайное число).Ребята, можете ли вы помочь мне в этом?

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

Вот мой код:

from lxml import html
import ssl
import requests
ssl._create_default_https_context = ssl._create_unverified_context
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
myRequest = requests.get("https://somesecureurl.com/", headers=headers)
webpage = html.fromstring(myRequest.content)
theLinks = webpage.xpath("//a[contains(@href,'^/static_word/[A-Za-z0-9_-]/[0-9]$')]")

print(theLinks)

1 Ответ

0 голосов
/ 18 мая 2018

Существует совпадений () , которые можно использовать для сопоставления требуемой строки с помощью регулярного выражения:

//a[matches(@href,'^/static_word/[A-Za-z0-9_-]+/[0-9]+$')]

, но AFAIK lxml не поддерживает функции XPath 2.0

Вместо этого вы можете попробовать это:

//a[starts-with(@href, '/static_word/') and 
    (string-length(@href)-string-length(translate(@href, '/', '')))=3 and
    number(substring-after(substring-after(@href, '/static_word/'), '/'))>=0]

Указанный выше предикат должен соответствовать:

  • starts-with(@href, "/static_word/") - a узел с @href, который начинается с подстроки '/static_word/'
  • (string-length(@href)-string-length(translate(@href, '/', '')))=3 - также @href содержит ровно 3 слеша
  • number(substring-after(substring-after(@href, '/static_word/'), '/'))>=0 - последняя подстрока - любое положительное число

Это выглядитужасно, но должно работать :) 1029 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...