Получить значение из объекта в JavaScript в XPATH - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно извлечь информацию из файлов HTML.Для большинства из них мне просто нужно сопоставить содержимое или атрибут определенного элемента DOM, поэтому я использую выражения XPATH, такие как //a[@class="targeturl"]/@href и инструмент командной строки xidel .

В другом пакете файлов нужная мне информация находится в script, который не так легко доступен:

<html>
<head><!-- ... --></head>
<body>
    ...
    <script>
        ...
        var o = {
            "numeric": 1234,
            "target": "TARGET",
            "urls": "http://example.com",
            // Commented pair "strings": "...",
            "arrays": [
               {
                  "more": true
               }
               ,
               { 
                  "itgoeson": true
               }
            ]
        };
    </script>
    ...
</body>
</html>

Обратите внимание, что объект, содержащий значение, которое я хочу получить, не являетсядействительный JSON.Тем не менее, кажется, что в каждой строке соответствует одна пара ключ-значение.

Что я могу передать xidel --xpath "???", чтобы получить TARGET?

Я пробовал разные вещи с функциями XPATH, но я не могу найти решение, не передавая другие команды (match говорит мне да / нет, replace работает построчно ...,и т.д.).

Ответы [ 2 ]

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

Что я могу передать xidel --xpath "???", чтобы получить TARGET?

Поскольку var o на самом деле является JSON, я предлагаю вам трактовать его так:

-e "json(
      //script/extract(
        .,
        'var o = (.+);',
        1,'s'
      )[.]
    )/target"
  • Извлечение {"field1": 1234, "target": "TARGET", "morefields": "..."} из узла элемента <script> (json охватывает несколько строк, поэтому не забывайте флаг 's' regex).
  • Интерпретируйте вывод какjson, обернув вокруг него json( ) (или //script/...[.] ! json(.)) и выберите атрибут target.

[edit]
Чтобы удалить комментарии(начиная с //):

-e "json(
      //script/replace(
        extract(
          .,
          'var o = (.+);',
          1,'s'
        )[.],
        '\s+//.+',
        ''
      )
    )/target"

Не самый красивый запрос, но он работает.
[/ edit]

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

Попробуйте реализовать ниже XPath:

substring-before(substring-after(//script, '"target": '), ",")
...