823g4n8901
823g4n8901

Reputation: 139

Text Node Selector within single td using jQuery

I need to extract the text after Name:, Phone:, Email:, Lead Submitted:, Comments:, Property Address 1:

The problem is all these text nodes are siblings. I don't know how to choose a sibling by number if it's a text node - e.g. the top sibling is a span but the rest are text nodes. I have tried different iterations but the only thing I'm getting to work is var comments = $('span:contains("Renter's Information")').siblings().text().trim(); But this pulls all the text, not just the comments text. Ideally I'd like to get not just each text node but the text after 'Name:', 'Phone:' etc. but I will probably have to trim that off post jQuery though. Any guidance on pulling these individual text nodes would be appreciated.

<td align="left" style="font-family:'Lucida Grande','Lucida Sans Unicode','Lucida Sans','DejaVu Sans',Verdana,sans-serif;font-size:14px;color:#666;padding:24px">
<span style="font-size:18px;font-weight:bold;color:#333">Renter's Information</span>
<br> Name: Shelby 
<br> Phone: <a href="tel:(555)%25555-5555" style="color:#666;text-decoration:none" target="_blank">(555) 555-555</a>
<br> Email: <a href="mailto:[email protected]" style="color:#666;text-decoration:none" target="_blank">[email protected]</a>
<br> Lead Submitted: 9/13/2020 1:42:37 PM
<br>
<br> <span style="font-size:18px;font-weight:bold;color:#333">Renter's Preferences</span>
<br> Beds/Baths:
<br> Model:
<br> Unit:
<br>
<br> Move Date: 11/2/2020
<br> Comments: Hi there! Just came across your listing online. I was wondering if you could send us some updated photos and financial information, as in if anything is included in cost, how much the house needs paid off &amp; just some details so we can look to see if we want to check it out. Thank you!
<br>
<br> <span style="font-size:18px;font-weight:bold;color:#333">Property Information</span>
<br> Link: <a href="https://www.apartments.com/" style="color:#77b800;text-decoration:none" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=">https://www.apartments.com/</a>
<br> To: <a href="#m_7_" style="color:#666;text-decoration:none">property</a>
<br> Property Address 1: <a href="#m_7654125587635847623_" style="color:#666;text-decoration:none">property</a>
<br> Property Address 2: <a href="#m_7654125587635847623_" style="color:#666;text-decoration:none"></a>
<br> City: city
<br> State: NY
<br> Zip: 12345
<br>
<br> <span style="font-weight:bold">Wishing you success in converting this True Lead™ to a lease!</span>
<br> <span style="font-weight:bold">The <a href="https://www.apartments.com/customers" style="color:#666;text-decoration:none" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://www.apartments.com/customers&amp;source=gmail&amp;ust=1603510777154000&amp;usg=AFQjCNHUYM0naErXYLjI9u_P_I4jk9Xtfg">Apartments.com Network</a> Team</span>
</td>

Upvotes: 0

Views: 64

Answers (1)

Saadi Toumi Fouad
Saadi Toumi Fouad

Reputation: 2829

I understood from your question that you want to get some text according to some keywords in your HTML, here is an implementation for that! and I have edited my answer to store the content in an array instead of logging them on the fly

// the words you search for, note that in this solution they need to be ordered
// just to avoid nested for loops that leads to larger time complexity
let searchKeywords = ["Name", "Phone", "Email", "Lead Submitted", "Comments", "Property Address 1"];
            
function getTextContent(keywords, htmlContent) {
  // an array to store in the content
  let arr = [];
  // since there is a <br> element before each span element that makes it
  // easy to just get the html and split it into lines
  htmlContent.split("<br>").forEach(function(e) {
    if(e.startsWith(` ${searchKeywords[arr.length]}`)) {
      // if the current line starts with the current keyword then if it has an
      // <a> tag then get the text of it, otherwise just slice the keyword name
      arr.push((e.includes("<a") ? e.substring(e.indexOf(">") + 1, e.indexOf("</a>")) : e.slice(e.indexOf(":") + 1)).trim());
    }
  });
  return arr;
}

let result = getTextContent(searchKeywords, document.querySelector("td").innerHTML);
console.log(result);
<table>
  <tr>
    <td align="left" style="font-family:'Lucida Grande','Lucida Sans Unicode','Lucida Sans','DejaVu Sans',Verdana,sans-serif;font-size:14px;color:#666;padding:24px">
      <span style="font-size:18px;font-weight:bold;color:#333">Renter's Information</span>
      <br> Name: Shelby 
      <br> Phone: <a href="tel:(555)%25555-5555" style="color:#666;text-decoration:none" target="_blank">(555) 555-555</a>
      <br> Email: <a href="mailto:[email protected]" style="color:#666;text-decoration:none" target="_blank">[email protected]</a>
      <br> Lead Submitted: 9/13/2020 1:42:37 PM
      <br>
      <br> <span style="font-size:18px;font-weight:bold;color:#333">Renter's Preferences</span>
      <br> Beds/Baths:
      <br> Model:
      <br> Unit:
      <br>
      <br> Move Date: 11/2/2020
      <br> Comments: Hi there! Just came across your listing online. I was wondering if you could send us some updated photos and financial information, as in if anything is included in cost, how much the house needs paid off &amp; just some details so we can look to see if we want to check it out. Thank you!
      <br>
      <br> <span style="font-size:18px;font-weight:bold;color:#333">Property Information</span>
      <br> Link: <a href="https://www.apartments.com/" style="color:#77b800;text-decoration:none" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=">https://www.apartments.com/</a>
      <br> To: <a href="#m_7_" style="color:#666;text-decoration:none">property</a>
      <br> Property Address 1: <a href="#m_7654125587635847623_" style="color:#666;text-decoration:none">property</a>
      <br> Property Address 2: <a href="#m_7654125587635847623_" style="color:#666;text-decoration:none"></a>
      <br> City: city
      <br> State: NY
      <br> Zip: 12345
      <br>
      <br> <span style="font-weight:bold">Wishing you success in converting this True Lead™ to a lease!</span>
      <br> <span style="font-weight:bold">The <a href="https://www.apartments.com/customers" style="color:#666;text-decoration:none" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://www.apartments.com/customers&amp;source=gmail&amp;ust=1603510777154000&amp;usg=AFQjCNHUYM0naErXYLjI9u_P_I4jk9Xtfg">Apartments.com Network</a> Team</span>
    </td>
  </tr>
</table>

And for your comment:

The above HTML is part of a much larger section of HTML so to locate the td I'd have to search for the text "Renter's Information" and then from there I can implement the script you recommended

Well you can filter the span elements to get the one that has the text content "Renter's Information" and then get its parent element which will be the td element you are looking for, here is the code

let tdElement = Array.prototype.filter.call(document.querySelectorAll("span"), function(e) {
  return e.textContent === "Renter's Information";
})[0].parentElement;

And then get your content by calling getTextContent() like this

let result = getTextContent(searchKeywords, tdElement.innerHTML);

Upvotes: 1

Related Questions