Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 在td'中获取文本;s位于具有特定id的表中,tr具有特定属性_Html_Python 3.x_Beautifulsoup - Fatal编程技术网

Html 在td'中获取文本;s位于具有特定id的表中,tr具有特定属性

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

给定如下html:

    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解决方案很感兴趣。无论如何,谢谢你。