2016-11-03 3 views
0

Я пытаюсь выяснить способ вытащить определенные значения из большого длинного текстового блока.XPath для выбора определенного текста внутри текстового блока

До сих пор у меня есть // td [@ class = "PadLeft10"], который возвращает мне большое значение, начиная с названия компании и заканчивая фрагментом «Просмотреть дополнительную информацию».

Я пытаюсь разбить мои результаты на сегменты, поэтому, например, я хочу, чтобы мой код искал слова «Первичный контакт:», а затем возвращал текст, следующий за ним, заканчивающийся на <br/>.

Мне нужно получить название компании, которое всегда является первым битом текста, затем основным контактом, затем адресом, затем телефоном и факсом, затем веб-сайтом и типом организации.

Проблема в том, что не каждая запись имеет все значения. Как вы можете видеть, вторая запись имеет адрес и веб-сайт, но первый нет.

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

Любое направление было бы рад.

<td align="left" valign="top" width="2%"> 
<script> 
    if (0 == 1) document.write('<img src="https://website.com" border="0" alt=""/>'); 
</script> 
<br/><br/></td> 
<td class="PadLeft10" align="left" valign="top" width="32%" style="padding-left: 15px;"> 
<span style="font-weight: bold;font-size: 12pt;"><br/>Company Name Here</span><br/>Primary Contact: Mr. Eric Cartman <br/>Phone: (555) 555-5555<br/>Fax: (333) 333-3333<span style="text-decoration: underline;color: #0000ff"></span><br/>Organization Type: Distributor Branch 
<br/> 
<a href="javascript:OpenNewWindow('DemographicsShow.aspx?FormKey=6546513265&Title='+escape('Company Name Here')+'&Key=654321231651');" class="DataFormHyperLink" title="Click here for more information">» View More Info</a><br/> 
<br/> 
</td> 


<td align="left" valign="top" width="2%"> 
<script> 
    if (0 == 1) document.write('<img src="https://website.com" border="0" alt=""/>'); 
</script> 
<br/><br/></td> 
<td class="PadLeft10" align="left" valign="top" width="32%" style="padding-left: 15px;"> 
<span style="font-weight: bold;font-size: 12pt;"><br/>Other Company</span><br/>Primary Contact: Mr. Jimmy Valmer<br/>100 N Ohio St 2rd Fl<br/>Rochester, IN 54225<br/>United States<br/>Phone: (888) 888-8888<br/>Fax: (999) 999-9999<span style="text-decoration: underline;color: #0000ff"><br/>Web Site: <a href="http://www.companywebsite.com" target="_blank">http://www.companywebsite.com</a></span><br/>Organization Type: Financial Service 
<br/> 
<a href="javascript:OpenNewWindow('DemographicsShow.aspx?FormKey=65484651534684&Title='+escape('Other Company')+'&Key=65484561534986');" class="DataFormHyperLink" title="Click here for more information">» View More Info</a><br/> 
<br/> 
</td> 


</tr> 
<tr> 

ответ

0

Любое направление будет высоко оценено.

Что касается направления, разделы в ячейке таблицы, о которых вы упоминаете, не являются ни вложенными элементами DOM, ни узлами DOM типа Sibling. Это последовательных элементов html, которые требуют специальной обработки.

<br/>Company Name Here</span> 
<br/>Primary Contact: Mr. Eric Cartman 
<br/>Phone: (555) 555-5555 
<br/>... 

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

+0

Спасибо, это очень полезно. – LibertyForLife

+0

@LibertyForLife, если вы сочтете это полезным, не могли бы вы проверить этот ответ? –

0


Я новичок в XPath, но не менее я могу сказать: если вы являетесь создателем HTML кода, вы абсолютно необходимо, чтобы изменить его более структурированным
как: Первичный контакт: <span id/class='primaryContact'>..</span>
Или же, вы можете получить элементы этим селектором (для редактирования) //td[@class="PadLeft10"]//child::span//following-sibling::text()[1] split by ':', а затем продолжить, но это решение останется просто.

+0

К сожалению, я не создатель ...Если бы я был, то это определенно было бы более структурированным! Я попробую ваши примеры и отчитаюсь. Благодаря! – LibertyForLife

+0

Я рекомендую вам использовать ** firepath ** с ** firebug ** для более быстрого просмотра результатов. –

0

Вы можете выбрать текстовый узел, который вы ищете, используя предикат и contains функции:

//td[@class="PadLeft10"]/text()[contains(., "Primary Contact:")] 

Тогда вы можете получить подстроку с помощью substring-after функции:

substring-after(
    //td[@class="PadLeft10"]/text()[contains(., "Primary Contact:")], 
    'Primary Contact:' 
) 

И удалить пробелы между ведущими и конечными пробелами с использованием normalize-space:

normalize-space(
    substring-after(
     //td[@class="PadLeft10"]/text()[contains(., "Primary Contact:")], 
     'Primary Contact:' 
    ) 
) 
Смежные вопросы