Python 即使存在子级,也获取表数据的文本-LXML

Python 即使存在子级,也获取表数据的文本-LXML,python,html,lxml,Python,Html,Lxml,尝试从HTML中的表中的行中提取文本,其中每个表数据标记可能有嵌套标记,也可能没有嵌套标记。我一直在使用python中的lxml库来实现数据提取,但我不太清楚如何最好地处理这个问题: from lxml import etree, html s = """<table> <tr><th>Event</th><th>Start Date</th><th>End Date</th></tr&

尝试从HTML中的表中的行中提取文本,其中每个表数据标记可能有嵌套标记,也可能没有嵌套标记。我一直在使用python中的lxml库来实现数据提取,但我不太清楚如何最好地处理这个问题:

from lxml import etree, html


s = """<table>
  <tr><th>Event</th><th>Start Date</th><th>End Date</th></tr>
  <tr><td>a</td><td>b</td><td>c</td></tr>
  <tr><td><code>d</code></td><td>e</td><td>f</td></tr>
  <tr><td>g</td><td>h</td><td>i</td></tr>
</table>
"""

table = etree.HTML(s).findall("body/table/tr/td")

rows = iter(table)
headers = ['row 1', 'row 2', 'row 3']
for row in rows:
    values = [col.text for col in row]
    print dict(zip(headers, values))

这是我到目前为止从另一个示例中提取的代码。

我将使用BeautifulSoup库中的
lxml
解析器执行以下操作:

from bs4 import BeautifulSoup
import pandas as pd

s = """<table>
  <tr><th>Event</th><th>Start Date</th><th>End Date</th></tr>
  <tr><td>a</td><td>b</td><td>c</td></tr>
  <tr><td><code>d</code></td><td>e</td><td>f</td></tr>
  <tr><td>g</td><td>h</td><td>i</td></tr>
</table>
"""

soup = BeautifulSoup(s, 'lxml')

headers = [h.text for h in soup.find_all('th')]
rows = soup.find_all('tr')[1:]

dic_list = []
for row in rows:
    data = [i.text for i in row]
    dic = {k:v for k,v in zip(headers, data)}
    dic_list.append(dic)

df = pd.DataFrame(dic_list)
print(df)
这导致:

  End Date Event Start Date
0        c     a          b
1        f     d          e
2        i     g          h

嗯,忘了B。熊猫的使用是过度的,但看起来很不错。我现在就来试试。@MarkII是的,当然有更简单的方法来实现这一点,但这两个库非常适合这类任务