我正在尝试使用伪操纵者从与另一个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”
答案 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')
使用伪装者$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表达最出色的地方:
//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);