Использование регулярных выражений в веб-урожай XML
Я использую веб-сбор, чтобы удалить какой-либо сайт электронной коммерции. Я перебираю страницу поиска и получаю информацию о каждом продукте в выходном XML-файле. Но теперь я хочу использовать регулярное выражение в теге anchor (a) при очистке и получать конкретные данные. string.ie,
let $linktoprod :=data($item//a[@class="fk-anchor-link"]/@href)
Приведенная выше строка возвращает значение привязки тега href для каждого продукта, т. Е. Для первого продукта возвращается значение:
/casio-sheen-analog-watch-women/p/itmdaqmvzyy23hz5?pid=WATDAQMVVNQEM9CX&ref=6df83d8f-f61f-4648-b846-403938ae92fa
Теперь я хочу использовать регулярное выражение вроде /([^/\?]+)\? и получить строку между последним / и? т.е.
itmdaqmvzyy23hz5
в выходной XML. Пожалуйста, помогите мне всем, кто имеет представление об этом. Спасибо.
Обновлено -
<?xml version="1.0" encoding="UTF-8"?>
<config charset="ISO-8859-1">
<function name="download-multipage-list">
<return>
<while condition="${pageUrl.toString().length() != 0}" maxloops="${maxloops}" index="i">
<empty>
<var-def name="content">
<html-to-xml>
<http url="${pageUrl}"/>
</html-to-xml>
</var-def>
<var-def name="nextLinkUrl">
<xpath expression="${nextXPath}">
<var name="content"/>
</xpath>
</var-def>
<var-def name="pageUrl">
<template>${sys.fullUrl(pageUrl.toString(), nextLinkUrl.toString())}</template>
</var-def>
</empty>
<xpath expression="${itemXPath}">
<var name="content"/>
</xpath>
</while>
</return>
</function>
<var-def name="products">
<call name="download-multipage-list">
<call-param name="pageUrl">http://www.flipkart.com/watches/pr?sid=reh%2Cr18</call-param>
<call-param name="nextXPath">//a[starts-with(., 'Next')]/@href</call-param>
<call-param name="itemXPath">//div[@class="product browse-product "]</call-param>
<call-param name="pids"></call-param>
<call-param name="maxloops">5</call-param>
</call>
</var-def>
<var-def name="scrappedContent">
<!-- iterates over all collected products and extract desired data -->
<![CDATA[ <catalog> ]]>
<loop item="item" index="i">
<list><var name="products"/></list>
<body>
<xquery>
<xq-param name="item" type="node()"><var name="item"/></xq-param>
<xq-expression><![CDATA[
declare variable $item as node() external;
let $linktoprod :=data($item//a[@class="fk-anchor-link"]/@href)
let $name := data($item//div[@class="title"])
return
<product>
<link>{$linktoprod}</link>
<title>{normalize-space($name)}</title>
</product>
]]></xq-expression>
</xquery>
</body>
</loop>
<![CDATA[ </catalog> ]]>
</var-def>
</config>
Мой конфиг xml, как показано выше. Где использовать блок кода regexp в моем xml? И я хочу, чтобы регулярное выражение применялось к linktoprod и, наконец, получало вывод регулярного выражения в теге ссылки как выходной файл xml. Пожалуйста, кто-нибудь поможет мне. Спасибо.
2 ответа
Я не знаю о веб-сборах, но если он поддерживает не жадный квантификатор, вы можете использовать этот шаблон
/([^/]+?)\?
В соответствии с руководством пользователя Web Harvest - regexp, вы должны вставить что-то вроде этого
<regexp>
<regexp-pattern>/([^/]+?)\?</regexp-pattern>
<regexp-source>
/casio-sheen-analog-watch-women/p/itmdaqmvzyy23hz5?pid=WATDAQMVVNQEM9CX&ref=6df83d8f-f61f-4648-b846-403938ae92fa
</regexp-source>
<regexp-result>
<template>Last URL part is "${_1}"</template>
</regexp-result>
</regexp>
в <regexp-source>
часть вы должны вставить свой URL или переменную для поиска. Угадывая из руководства и вашего конфиг xml это может быть что-то вроде
<regexp-source>
<var>scrappedContent</var>
</regexp-source>
или же
<regexp-source>
${linktoprod}
</regexp-source>
Я думаю, что вы должны немного поэкспериментировать.
Попробуйте это регулярное выражение:
/([^/]+)\?
Возможно, вам придется лишить ведущих /
и тянущийся ?
,
Чтобы проиллюстрировать, что регулярное выражение работает, вот его результат в JavaScript:
var s = "/casio-sheen-analog-watch-women/p/itmdaqmvzyy23hz5?pid=WATDAQMVVNQEM9CX&ref=6df83d8f-f61f-4648-b846-403938ae92fa"
console.log(s.match(/\/([^/]+)\?/g)); // /itmdaqmvzyy23hz5?