use*_*568 5 html python beautifulsoup
我正在努力将一些片状HTML表格解析为Beautiful Soup列表.有问题的表缺少</ td>标签.
使用以下代码(不是我正在解析的真实表,但功能相似):
import bs4
test = "<table> <tr><td>1<td>2<td>3</tr> <tr><td>1<td>2<td>3</tr> </table>"
def walk_table2(text):
"Take an HTML table and spit out a list of lists (of entries in a row)."
soup = bs4.BeautifulSoup(text)
return [[x for x in row.findAll('td')] for row in soup.findAll('tr')]
print walk_table2(test)
Run Code Online (Sandbox Code Playgroud)
给我:
[[<td>1<td>2<td>3</td></td></td>, <td>2<td>3</td></td>, <td>3</td>], [<td>4<td>5<td>6</td></td></td>, <td>5<td>6</td></td>, <td>6</td>]]
Run Code Online (Sandbox Code Playgroud)
而不是预期的:
[[<td>1</td>, <td>2</td>, <td>3</td>], [<td>1</td>, <td>2</td>, <td>3</td>]]
Run Code Online (Sandbox Code Playgroud)
似乎Beautiful Soup正在使用的lxml解析器决定在</ tr>的下一个实例之前添加</ td>标记而不是<td>的下一个实例.
在这一点上,我想知道是否有一个很好的选择让解析器将结束的td标记放在正确的位置,或者如果在将字符串抛入BeautifulSoup之前使用正则表达式来手动放置它们会更容易. . 有什么想法吗?提前致谢!
您将看到 Python 内置 HTML 解析器做出的决策。如果您不喜欢解析器的处理方式,您可以告诉 Beautiful Soup 使用不同的解析器。html5lib 解析器和 lxml 解析器都给出您想要的结果:
>>> soup = bs4.BeautifulSoup(test, "lxml")
>>> [[x for x in row.findAll('td')] for row in soup.findAll('tr')]
[[<td>1</td>, <td>2</td>, <td>3</td>], [<td>1</td>, <td>2</td>, <td>3</td>]]
>>> soup = bs4.BeautifulSoup(test, "html5lib")
>>> [[x for x in row.findAll('td')] for row in soup.findAll('tr')]
[[<td>1</td>, <td>2</td>, <td>3</td>], [<td>1</td>, <td>2</td>, <td>3</td>]]
Run Code Online (Sandbox Code Playgroud)