python - 将 html 表转换为字典而不丢失结构

标签 python html beautifulsoup html-parsing

我是 Python(和编程)新手,并且是第一次使用 BeautifulSoup

我正在尝试找到解析 html 表格内容并将其转换为字典的最佳方法 - 最好以最不脆弱的方式。

这是我尝试解析的 HTML 示例(我已经为我尝试选取的文本输入了键值数字)。

<div class="tablename">
<table border="0" cellpadding="0" cellspacing="0" style="border: 1px solid #dddddd;  border-collapse: collapse; font-family: Arial, Helvetica, sans-serif; font-size: 14px; margin: 0; padding: 0; width: 100%">
<thead>
<tr>
<th colspan="4" style="background-color: #000; border: 1px solid #616161; color: #ffffff; font-size: 14px; font-weight: bold; line-height: 20px; padding: 14px 20px 12px 20px; text-align: left">Some text not needed</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 20px"> </td>
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; width: 42.5%; vertical-align: middle">Key 1</td>
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 1</td>
<td style="width: 20px"> </td>
</tr>
<tr>
<td> </td>
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; vertical-align: middle">Key 2</td>
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 2</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; vertical-align: middle">Key 3</td>
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 3</td>
<td> </td>
</tr>
<tr>

我正在使用的代码:

import requests
from bs4 import BeautifulSoup

html = requests.get('https://examplewebaddress.com')
soup = BeautifulSoup(html.text)
print(soup.tbody.text)

然后我可以循环 soup.tbody.text 字符串并将其拆分为键值对。但这似乎不是一个好方法,我似乎通过将其转换为字符串然后将其重新构建到字典中而丢失了表的结构。

是否有更直接的方法将带有 BeautifulSoup (或更合适的东西)的表解析为我可以使用的字典?

最佳答案

这个想法是迭代表行,并为每行提取代表 future 字典的键和值的第二个和第三个单元格的文本:

soup = BeautifulSoup(html.text)

result = dict([[item.get_text(strip=True) for item in row.find_all('td')[1:3]]
               for row in soup.select("div.tablename table tr")[1:]])

print result

对于提供的示例数据,它打印:

{u'Key 1': u'Value 1', u'Key 2': u'Value 2', u'Key 3': u'Value 3'}

div.tablename table trCSS selector它将匹配以 class="tablename" 作为父级的 divtable 元素下的所有 tr 元素。我们对 select ([1:]) 的结果进行切片以跳过第一个标题行。

关于python - 将 html 表转换为字典而不丢失结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29395788/

相关文章:

python - np.lexsort 背后的排序逻辑是什么?

python - Pandas 和 Matplotlib 将 df 绘制为具有 2 个 y 轴的子图

Javascript 和 CSS 导致文本框消失,我希望它保留

javascript - Python 在警报中单击按钮

python - 无法使用 python 和 beautifulsoup 抓取网页中的某些 href

python - 如何在 Django 中的关系中指定唯一性

python - 从服务器直接打印到 Google App Engine 上的 Google Cloud Print

jquery - 在 jquery 模型中运行脚本

javascript - 我如何在 <body> 中没有 onload 的情况下初始化 brython

python - BeautifulSoup 刮img