поиск элемента учитывая его содержание 
		
		
		
		как на чистом js, "одной строкой", найти tr-ы содержащие оба блока  
	<tr> <th></th> <td></td> </tr>  | 
	
		
 Что такое "блок"? 
	 | 
	
		
 в примере tr содержит два блока th и td 
	
doc.querySelectorAll("tr").forEach((e,i)=>{
                    let th=e.querySelector("th");
                    let td=e.querySelector("td")
                    if (th && td){
                      console.log('наш вариант')
                    }
                  })
тоже самое, но без перебора можно сделать? еще в doc.querySelectorAll("tr .... ") отобрать сразу нужные, содержащие th и td  | 
	
		
 CSS не умеет искать по содержимому. Соответственно одной строкой - никак(если конечно не положить в эту в строку весь код ручного поиска). Ну ещё можно с помощью xpath, но не нужно. 
	 | 
	
		
 Современные браузеры, которые поддерживают псевдокласс has (почти все, кроме FF) должны взять  
	doc.querySelectorAll("tr:has(th):has(td)")  | 
	
		
 od0201, 
	
let trs = [...document.querySelectorAll('tr > td ~ th, tr > th ~ td')].map(({parentNode}) => parentNode);
 | 
	
		
 рони, 
	В общем случае не сработает В ситуации <td><th><td> или <th><td><th> мы найдем и th и td, как разные элементы. Родитель у них один, но он будет повторяться 2 раза в выходном массиве.  | 
	
		
 рони, тут ещё надо на уникальность почитить, на случай td ~ th ~ td.) 
	voraa, не поддерживается в FF - идёт нахрен. Не надо тут вторую эпоху IE разводить.) P.S. Вроде красиво же? 
document.evaluate("//tr[td and th]", document)
 А подвох в том, что оно не массив возвращает и всё равно ручками по циклу пройтись придётся.) | 
	
		
 :)  
	
[...new Set([...document.querySelectorAll('tr > td ~ th, tr > th ~ td')].map(({parentNode}) => parentNode))]
 | 
	
		
 спасибо, именно это мне и нужно было. 
	 | 
| Часовой пояс GMT +3, время: 08:40. |