XPath для выбора конкретного текста внутри текстового блока

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

До сих пор у меня есть //td[@class=»PadLeft10″], который возвращает мне большое длинное значение, начиная с названия компании и заканчивая «View More Info».

Я пытаюсь разбить свои результаты на сегменты, поэтому, например, я хочу, чтобы мой код искал слова «первичный контакт:», а затем возвращал текст, который следует за этим, заканчиваясь на <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>

3 ответа

  1. Любое направление было бы очень оценено.

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

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

    И xpath, и regex могут быть использованы для такого случая.

  2. Вы можете выбрать текстовый узел, который вы ищете, используя предикат и 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:'
        )
    )
    
  3. Я новичок в xpath, но по крайней мере могу сказать: если вы являетесь создателем html-кода, вам абсолютно необходимо изменить его, чтобы быть более структурированным
    как: первичный контакт:<span id/class='primaryContact'>..</span>

    Или же, вы можете получить элементы с помощью этого селектора (для редактирования) //td[@class="PadLeft10"]//child::span//following-sibling::text()[1]разделить на»:», а затем продолжить, но это решение остается просто diy.