Как получить подстроку из строки, используя xpath 1.0 в lxml - PullRequest
0 голосов
/ 03 января 2019

Это пример HTML.

<html>
  <a href="HarryPotter:Chamber of Secrets">
    text
  </a>
  <a href="HarryPotter:Prisoners in Azkabahn">
    text
  </a>
</html>

Я нахожусь в ситуации, когда мне нужно извлечь

Chamber of Secrets
Prisoners in Azkabahn 

Я использую lxml 4.2.1 в python, который использует xpathb1.0. Я пытался извлечь с помощью XPath

'substring-after(//a/@href,"HarryPotter:")' 

, который возвращает только "Chamber of Secrets".

и с XPath

'//a/@href[substring-after(.,"HarryPotter:")]' 

, который возвращает

'HarryPotter:Chamber of Secrets'
'HarryPotter:Prisoners in Azkabahn'

Я искал это и получил новое обучение, но не нашел решения моей проблемы.

Я пробовал другой XPath, используя substring-after.

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

Я обнаружил, что в XPath 2.0 и выше легко манипулировать строкой с помощью регулярных выражений, но мы также можем использовать регулярные выражения в XPath 1.0 с использованием расширений XSLT.

Можем ли мы сделать это с помощью функции substring-after, если да, то каков XPath, а если нет, то каков наилучший подход для получения желаемого результата?

И как мы можем получить желаемый результат, используя регулярные выражения в XPath, придерживаясь lxml.

Ответы [ 2 ]

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

Если вы хотите использовать substring-after() и substring-before() и вместе

Вот пример:

из lxml import html

f_html = """<html><body><table><tbody><tr><td class="df9" width="20%">
         <a class="nodec1" href="javascript:reqDl(1254);" onmouseout="status='';" onmouseover="return dspSt();">
          <u>
           2014-2
          </u>
         </a>
        </td></tr></tbody></table></body></html>"""
tree_html = html.fromstring(f_html)
deal_id = tree_html.xpath("//td/a/@href")
print(tree_html.xpath('substring-after(//td/a/@href, "javascript:reqDl(")'))
print(tree_html.xpath('substring-before(//td/a/@href, ")")'))
print(tree_html.xpath('substring-after(substring-before(//td/a/@href, ")"), "javascript:reqDl(")'))

Результат:

1254);
javascript:reqDl(1254
1254
0 голосов
/ 03 января 2019

Попробуйте этот подход, чтобы получить оба текстовых значения:

from lxml import html

raw_source = """<html>
  <a href="HarryPotter:Chamber of Secrets">
    text
  </a>
  <a href="HarryPotter:Prisoners in Azkabahn">
    text
  </a>
</html>"""
source = html.fromstring(raw_source)

for link in source.xpath('//a'):
    print(link.xpath('substring-after(@href, "HarryPotter:")'))
...