Html 如何使用BeautifulSoup提取表中的所有元素?

Html 如何使用BeautifulSoup提取表中的所有元素?,html,python-3.x,beautifulsoup,Html,Python 3.x,Beautifulsoup,我有一个很大的HTML文件,它是由几个HTML文件合并而成的,因此结构重复了N次如下所示: <html> <head> <body> <TABLE> <TABLE> </body> </html> <html> <head> <body> <TABLE> <TABLE> </body> </ht

我有一个很大的HTML文件,它是由几个HTML文件合并而成的,因此结构重复了N次
如下所示:

<html>
<head>
<body>
    <TABLE>
    <TABLE>  
</body>
</html>

<html>
<head>
<body>
    <TABLE>
    <TABLE>  
</body>
</html>

<html>
<head>
<body>
    <TABLE>
    <TABLE>  
</body>
</html> 
我该怎么做

我当前的代码查看文件中的所有表元素,但我不知道如何仅提取每个html块的第二个表中的元素

from bs4 import BeautifulSoup

fp = open("file.html", "rb")
soup = BeautifulSoup(fp, "html5lib")

tables = soup.find_all('table')

for tbl in tables:
    print(tbl.find_all())

如果您想将html表放入dataframe,那么可以尝试以下方法

import pandas as pd
import html5lib
url = 'file.html'
dfs = pd.read_html(url)
df = pd.concat(dfs)
df
您可以浏览文档,因为您可以提供表的id来获取特定的html表等,如
attrs={'id':'table'}

我当前的代码查找文件中的所有表元素,但我不知道 如何仅提取每个html的第二个表中的元素 街区

你已经在正确的轨道上了。首先迭代
html
块,然后只选择出现的第二个表如何?应该足够了,不是吗

raw_html = """<html>
<head>
<body>
    <table></table>
    <table><test id="second_table">test text 1</test></table>
</body>
</html>
<html>
<head>
<body>
    <table></table>
    <table><test id="second_table">test text 2</test></table>
</body>
</html>
<html>
<head>
<body>
    <table></table>
    <table><test id="second_table">test text 3</test></table>
</body>
</html>"""

soup = BeautifulSoup(raw_html, "html.parser")

for html_block in soup.find_all("html"):
    interesting_table = html_block.find_all("table")[1]  # keep the second table only
    print(interesting_table)  # do what you want with these tables now
raw_html=”“”
测试文本1
测试文本2
测试文本3
"""
soup=BeautifulSoup(原始html,“html.parser”)
用于汤中的html块。查找所有(“html”):
有趣的_table=html_block.find_all(“table”)[1]#只保留第二个表
打印(有趣的表格)#现在就用这些表格做你想做的事
输出:

<table><test id="second_table">test text 1</test></table>
<table><test id="second_table">test text 2</test></table>
<table><test id="second_table">test text 3</test></table>
测试文本1
测试文本2
测试文本3

推荐一个将所有HTML标记作为字符串处理的库

from simplified_scrapy import SimplifiedDoc
html = '''
<html>
<head>
<body>
    <table></table>
    <table><test id="test_id">test text 1</test></table>
</body>
</html>
<html>
<head>
<body>
    <table></table>
    <table><test id="test_id">test text 2</test></table>
</body>
</html>
<html>
<head>
<body>
    <table></table>
    <table><test id="test_id">test text 3</test></table>
</body>
</html> 
'''
doc = SimplifiedDoc(html)
htmls = doc.htmls
for h in htmls:
  table = h.getElement('table',start='</table>') # Use start='</table>' to skip the first table
  print (table.test.text)
  print (table.select('test#test_id'))

试着解释一下这个问题?一个普通的HTML文件只有一个HTML标记,一个body标记。这个文件有几个html块,除此之外,我只对每个
块的第二个表中的内容感兴趣。
块。最后,我希望有一个文件,其中包含每个第二个表中的元素的唯一HTML块。我希望能像OP建议的那样,用格式错误的HTML(多个
标记)理解这项工作?
from simplified_scrapy import SimplifiedDoc
html = '''
<html>
<head>
<body>
    <table></table>
    <table><test id="test_id">test text 1</test></table>
</body>
</html>
<html>
<head>
<body>
    <table></table>
    <table><test id="test_id">test text 2</test></table>
</body>
</html>
<html>
<head>
<body>
    <table></table>
    <table><test id="test_id">test text 3</test></table>
</body>
</html> 
'''
doc = SimplifiedDoc(html)
htmls = doc.htmls
for h in htmls:
  table = h.getElement('table',start='</table>') # Use start='</table>' to skip the first table
  print (table.test.text)
  print (table.select('test#test_id'))
test text 1
{'id': 'test_id', 'tag': 'test', 'html': 'test text 1'}
test text 2
{'id': 'test_id', 'tag': 'test', 'html': 'test text 2'}
test text 3
{'id': 'test_id', 'tag': 'test', 'html': 'test text 3'}