2016-05-02 68 views
0

考慮頁面變量中的html。XPATH - 有很多孩子的html

如何訪問td s?

我想訪問他們喜歡xpath("/table/tr/td/text())"

我不想指明其他TR小號

不幸的是這表達xpath('.//table/tr/tr/tr/td/text()')也不管用。

Python代碼:

import __future__ 
from lxml import html 
import requests 
from bs4 import BeautifulSoup 

page = """ 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>cv</title> 
</head> 
<body> 

    <table> 
     <tr> 
      <tr> 
       <tr> 
        <td>table1 td1</td> 
        <td>table1 td2</td> 
       </tr> 
      </tr> 
     </tr> 
    </table> 

    <table> 
     <tr> 
      <tr> 
       <tr> 
        <td>table2 td1</td> 
        <td>table2 td2</td> 
       </tr> 
      </tr> 
     </tr> 
    </table> 

    <table> 
     <tr> 
      <tr> 
       <tr> 
        <td>table3 td1</td> 
        <td>table3 td2</td> 
       </tr> 
      </tr> 
     </tr> 
    </table> 
</body> 
</html> 
""" 

soup = str(BeautifulSoup(page, 'html.parser')) 
tree = html.fromstring(soup) 

things = tree.xpath('.//table/tr/tr/tr/td/text()') 

print(things) 

for thing in things: 
     print(thing) 

print('That's all') 

我想從根源!

回答

1

使用XPath //td/text()

things = tree.xpath('//td/text()') 

//td代表「找到任何td元素在任何深度

對我的作品

打印td元素每table分組:。

doc = html.fromstring(page) 
for table_elm in doc.xpath("//table"): 
    print "another table" 
    things = table_elm.xpath('.//td/text()') 
    print(things) 

請注意,在這種情況下,xpath中的.有意義。

+0

不幫我,我希望它形成根!!! 原因隨後我會從每個表索引訪問tds,如: 'xpath(「/ table [1]/tr/td/text()」)' –

+0

'xpath(「/ table [1] // td/text()「)' –

+0

@ hr_117好吧,如果輸出按每個表分組,那麼我們每個表都會執行xpath。請參閱擴展答案。 –

1

您don'have轉換BeautifulSoupstr

soup = str(BeautifulSoup(page, 'html.parser')) 

您可以使用這樣的事情:

>>> soup = BeautifulSoup(page, 'html.parser') 
>>> for td in soup.find_all('td'): 
...  print(td) 
... 
<td>table1 td1</td> 
<td>table1 td2</td> 
<td>table2 td1</td> 
<td>table2 td2</td> 
<td>table3 td1</td> 
<td>table3 td2</td> 

或者,你也可以使用print(td.text)如果你想要的元素中的文本。

1

tr裏面的tr是無效的HTML。

而這似乎是由html.fromstring()解析器「固定」。

您可以使用此XPath測試:

things = tree.xpath('//table/tr/*') 

和產量:

for thing in things: 
    print(thing.tag) 

產生:

td 
td 
td 
td 
td 
相關問題