Html 在td'中获取文本;s位于具有特定id的表中,tr具有特定属性
给定如下html:Html 在td'中获取文本;s位于具有特定id的表中,tr具有特定属性,html,python-3.x,beautifulsoup,Html,Python 3.x,Beautifulsoup,给定如下html: page_html = ''' <html> <head> <title>Title</title> </head> <body> <div id="div1"> <h1>h1 text</h1> <div id="div div1">te
page_html = '''
<html>
<head>
<title>Title</title>
</head>
<body>
<div id="div1">
<h1>h1 text</h1>
<div id="div div1">text div div1
</div>
<p>text in p</p>
<table id="tab1" border="1">
<tr id="tab1 tr1" class="class1">
<td><a href="/info/tab1/tr1/td1">tab1 tr1 td 1</a></td>
<td><a href="/info/tab1/tr1/td2">tab1 tr1 td 2</a></td>
<td><a href="/info/tab1/tr1/td3">tab1 tr1 td 3</a></td>
</tr>
<tr id="tab1 tr2" class="class1">
<td><a href="/info/tab1/tr2/td1">tab1 tr2 td 1</a></td>
<td><a href="/info/tab1/tr2/td2">tab1 tr2 td 2</a></td>
</tr>
<tr id="tab1 tr3" class="class2">
<td><a href="/info/tab1/tr3/td1">tab1 tr3 td 1</a></td>
<td><a href="/info/tab1/tr3/td2">tab1 tr3 td 2</a></td>
</tr>
</table>
<table id="tab2" border="1">
<tr id="tab2 tr1" class="class2">
<td><a href="/info/tab2/tr1/td1">tab2 tr1 td 1</a></td>
<td><a href="/info/tab2/tr1/td2">tab2 tr1 td 2</a></td>
<td><a href="/info/tab2/tr1/td3">tab2 tr1 td 3</a></td>
</tr>
<tr id="tab2 tr2" class="class2">
<td><a href="/info/tab2/tr2/td1">tab2 tr2 td 1</a></td>
<td><a href="/info/tab2/tr2/td2">tab2 tr2 td 2</a></td>
</tr>
<tr id="tab2 tr3" class="class3">
<td><a href="/info/tab2/tr3/td1">tab2 tr3 td 1</a></td>
<td><a href="/info/tab2/tr3/td2">tab2 tr3 td 2</a></td>
</tr>
</table>
</div>
</body>
</html>
'''
我的部分解决方案是:
from bs4 import BeautifulSoup
bsobj = BeautifulSoup(page_html)
res = bsobj.find('table', id='tab2').findAll('tr', {'class':'class2'})
但我无法提取文本
尝试列表理解:
[td.text for td in res]
获取常规(右侧)结果,但作为两个tr的列表,并带有异常\n
,即:
['\ntab2 tr1 td 1\ntab2 tr1 td 2\ntab2 tr1 td 3\n','\ntab2 tr2 td
1\ntab2 tr2 td 2\n']
是否有一种更干净的方法来获取满足我在表和tr上的条件的每个td的文本?访问表的更好、更干净的方法是使用Vanilla JavaScript 首先,最好在
元素中添加id
,以避免冲突
以下是通过
-
let table = document.getElementById('myTable');
let trs = Array.from(table.getElementsByTagName('tr'));
trs.forEach(tr => {
let tds = Array.from(table.getElementsByTagName('td'));
tds.forEach(td => {
console.log(td.innerHTML);
})
})
实时操作-访问表的更好、更干净的方法是使用香草JavaScript 首先,最好在
元素中添加id
,以避免冲突
以下是通过
-
let table = document.getElementById('myTable');
let trs = Array.from(table.getElementsByTagName('tr'));
trs.forEach(tr => {
let tds = Array.from(table.getElementsByTagName('td'));
tds.forEach(td => {
console.log(td.innerHTML);
})
})
实时操作-结果集对象可以像列表一样处理,并直接用于列表理解。您可以使用嵌套列表理解,首先获取所有
tr
,然后从每个tr
获取所有td
,而无需存储中间结果
from bs4 import BeautifulSoup
bsobj = BeautifulSoup(page_html,'html.parser')
res = [td.text for tr in bsobj.find('table', id='tab2').findAll('tr', {'class':'class2'}) for td in tr.findAll('td')]
print(res)
输出
['tab2 tr1 td 1', 'tab2 tr1 td 2', 'tab2 tr1 td 3', 'tab2 tr2 td 1', 'tab2 tr2 td 2']
ResultSet对象可以像列表一样处理,并直接用于列表理解。您可以使用嵌套列表理解,首先获取所有
tr
,然后从每个tr
获取所有td
,而无需存储中间结果
from bs4 import BeautifulSoup
bsobj = BeautifulSoup(page_html,'html.parser')
res = [td.text for tr in bsobj.find('table', id='tab2').findAll('tr', {'class':'class2'}) for td in tr.findAll('td')]
print(res)
输出
['tab2 tr1 td 1', 'tab2 tr1 td 2', 'tab2 tr1 td 3', 'tab2 tr2 td 1', 'tab2 tr2 td 2']
可能我对语言不太清楚。我对Python3解决方案很感兴趣。不管怎样,谢谢你。也许我不太清楚这门语言。我对Python3解决方案很感兴趣。无论如何,谢谢你。