PuppeteerJS-如何基于相邻td的文本从td元素中抓取文本内容?

时间:2019-04-03 01:09:42

标签: element puppeteer scrape

我正在尝试使用伪操纵者从与另一个td相邻的td单元中刮取一个链接,以标记该链接的类型或描述。除文本内容外,没有其他类或id可以区分这些td单元格

         <tr>
            <td scope="row">1</td>
            <td scope="row">10-Q</td>
            <td scope="row"><a href="/Archives/edgar/data/1065280/000106528018000538/nflx-093018x10qxdoc.htm">nflx-093018x10qxdoc.htm</a></td>
            <td scope="row">10-Q</td>
            <td scope="row">1339833</td>
         </tr>
         <tr class="blueRow">
            <td scope="row">2</td>
            <td scope="row">EXHIBIT 31.1</td>
            <td scope="row"><a href="/Archives/edgar/data/1065280/000106528018000538/nflx311_q32018.htm">nflx311_q32018.htm</a></td>
            <td scope="row">EX-31.1</td>
            <td scope="row">14914</td>
         </tr>
         <tr>
            <td scope="row">3</td>
            <td scope="row">EXHIBIT 31.2</td>
            <td scope="row"><a href="/Archives/edgar/data/1065280/000106528018000538/nflx312_q32018.htm">nflx312_q32018.htm</a></td>
            <td scope="row">EX-31.2</td>
            <td scope="row">14553</td>
         </tr>
         <tr class="blueRow">
            <td scope="row">4</td>
            <td scope="row">EXHIBIT 32.1</td>
            <td scope="row"><a href="/Archives/edgar/data/1065280/000106528018000538/nflx321_q32018.htm">nflx321_q32018.htm</a></td>
            <td scope="row">EX-32.1</td>
            <td scope="row">12406</td>
         </tr>

td之后的链接包含“ 10Q”

2 个答案:

答案 0 :(得分:2)

您可以使用vanila javascript做到这一点,

// find all tr elements
[...document.querySelectorAll('tr')]

 // check which one of them includes the word
 .find(e=>e.innerText.includes('10-Q'))

 // get the link inside
 .querySelector('a') 

enter image description here

使用伪装者$eval,可以简化此过程,

page.$$eval('tr', eachTr=> eachTr.find(e=>e.innerText.includes('10-Q')).querySelector('a'))

page.evaluate

page.evaluate(()=> {
 // find all tr elements
    return [...document.querySelectorAll('tr')]

     // check which one of them includes the word
     .find(e=>e.innerText.includes('10-Q'))

     // get the link inside
     .querySelector('a')

     // do whatever you want to do with this
     .href
})

可读的解决方案。

答案 1 :(得分:1)

XPath表达式

这是XPath表达最出色的地方:

//td[contains(., '10-Q')]/following-sibling::td[1]/a[1]

此XPath表达式查询包含文本 10-Q td元素。然后它将使用以下td元素并返回其中的第一个链接(a)。另外,如果您不只是希望元素包含文本,而是要完全匹配它,则可以在开头使用//td[text()='10-Q']/

在木偶内部的用途

要使用伪造者获得元素,请使用page.$x函数。要从查询的节点提取信息(如href),请使用page.evaluate

放在一起,代码看起来像这样:

const [linkHandle] = await page.$x("//td[contains(., '10-Q')]/following-sibling::td[1]/a[1]");
const address = await page.evaluate(link => link.href, linkHandle);