在Python中获取td的全文(lxml)

时间:2016-10-14 08:44:54

标签: python html xpath lxml

我试图获取此td中包含的全文:

示例:

<td>
 <p>Some Text</p>
 <a>SAMPLE</a>
 <table>
  <tbody>
   <tr>
    <td>something</td>
    ....
   </tr>
   ...
  </tbody>
 </table>
 ...
</td>

这个标签里面有很多标签,这对我来说很难。甚至包含表格。

在FirePath(Firefox)中,我可以简单地附加// text()

  

.//* [@ ID =&#39; Testcases__list&#39;] /表/ tbody的/ TR / TD //文本()

但是在Python代码中,// text()部分使用lxml库

引发了一个错误
Traceback (most recent call last):
  File "D:\pythonscripts\Bachelor\TestMain.py", line 52, in <module>
    print tr.findall('./td[6]//text()')[0].text
  File "src\lxml\lxml.etree.pyx", line 1563, in lxml.etree._Element.findall (src\lxml\lxml.etree.c:56897)
  File "C:\Python27\lib\site-packages\lxml\_elementpath.py", line 304, in findall
    return list(iterfind(elem, path, namespaces))
  File "C:\Python27\lib\site-packages\lxml\_elementpath.py", line 277, in iterfind
    selector = _build_path_iterator(path, namespaces)
  File "C:\Python27\lib\site-packages\lxml\_elementpath.py", line 260, in _build_path_iterator
    selector.append(ops[token[0]](_next, token))
KeyError: '()'

如何在Python中获取该td的全文?

3 个答案:

答案 0 :(得分:4)

你应该使用 .xpath 而不是 findall

tr.xpath("//*[@id='Testcases__list']/table/tbody/tr/td//text()")

要获得第一个td:

 tr.xpath("(//*[@id='Testcases__list']/table/tbody/tr/td)[1]/text()")

我还要验证源实际上是否有 tbody 元素,通常是由浏览器添加而不是在实际源中。

您可以 text_content

tr.xpath("(//*[@id='Testcases__list']/table/tbody/tr/td)[1]")[0].text_content()

答案 1 :(得分:-1)

在这里,我将为您提供代码。

from lxml import etree
from lxml.html import tostring,fromstring
import re

TAG_RE = re.compile(r'<[^>]+>')


tree = etree.HTML('''
<td>
 <p>Some Text</p>
 <a>SAMPLE</a>
 <table>
  <tbody>
   <tr>
    <td>something</td>
    ....
   </tr>
   ...
  </tbody>
 </table>
 ...
</td>
''')
print TAG_RE.sub('',tostring(tree.xpath("//td")[0]))

答案 2 :(得分:-2)

如果是网站,你想要BeautifulSoup! https://www.crummy.com/software/BeautifulSoup/

这样的事情:

import requests
from bs4 import BeautifulSoup

r = requests.get("Your_Link")

soup = BeautifulSoup(r.content)
print soup.find('td').text

这会抓住网站寻找td标签,并在它之间返回任何内容。如果此标记是另一个标记的子标记,则需要查看父标记和子标记关系,以便您可以导航到此特定标记并打印其信息。