Python 如何通过beautifulsoup4中的文本内容获取标记元素
我不得不从上千个站点、本地HTML文件中删除数据,复杂的是这些站点就像90年代的结构,几乎相同的嵌套表结构,没有Python 如何通过beautifulsoup4中的文本内容获取标记元素,python,html,beautifulsoup,Python,Html,Beautifulsoup,我不得不从上千个站点、本地HTML文件中删除数据,复杂的是这些站点就像90年代的结构,几乎相同的嵌套表结构,没有id的noCSS类只有嵌套表,我如何在一个tr标记中选择文本中的特定表基 XPath不是一个解决方案,因为站点主要是相同的结构,但并不总是具有相同的表顺序,所以我正在寻找一种方法来从所有站点中提取这些表数据,选择或搜索某些表b中的一些文本,并由此获得父标记 有什么想法吗 每个页面上的代码都非常庞大,这里是结构示例,数据并不总是在同一个表位置 更新: 多亏了alecxe,我编写了这段代码
id
的noCSS
类只有嵌套表,我如何在一个tr标记中选择文本中的特定表基
XPath
不是一个解决方案,因为站点主要是相同的结构,但并不总是具有相同的表顺序,所以我正在寻找一种方法来从所有站点中提取这些表数据,选择或搜索某些表b中的一些文本,并由此获得父标记
有什么想法吗
每个页面上的代码都非常庞大,这里是结构示例,数据并不总是在同一个表位置
更新:
多亏了alecxe,我编写了这段代码
# coding: utf-8
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
html_content = """
<body>
<table id="gotthistable">
<tr>
<table id="needthistable">
<tr>
<td>text i'm searching</td>
</tr>
<tr>
<td>Some other text</td>
</tr>
</table>
</tr>
<tr>
<td>
<table>
<tr>
<td>Other text</td>
</tr>
<tr>
<td>Some other text</td>
</tr>
</table>
</td>
</tr>
</table>
<table>
<tr>
<td>Different table</td>
</tr>
</table>
</body>
"""
soup = BeautifulSoup(html_content, "lxml")
table = soup.find(lambda tag: tag.name == "table" and "searching" in tag.text)
print table
我得到了我想要的输出:
<table id="needthistable">
<tr>
<td>text im searching</td>
</tr>
<tr>
<td>Some other text</td>
</tr>
</table>
文本im搜索
其他一些文本
但是如果不总是在相同的两个父元素上呢?我的意思是,如果a得到了这个td标签,我如何才能得到它所属的表格。使用BeautifulSoup:
如果传入正则表达式对象,Beauty Soup将进行过滤
使用该正则表达式的search()方法
例如:
soup.find_all(name='tr', text=re.compile('this is part or full text of tr'))
您应该将find()
与一起使用,并检查表的.text
以包含所需的文本:
soup.find(lambda tag: tag.name == "table" and "part of text" in tag.text)
演示:
>>来自bs4导入组
>>>
>>>data=”“”
...
...
...
…此文本包含文本的一部分
...
...
…其他文本
...
...
...
...
...
…不同的桌子
...
...
...
...
... """
>>>
>>>soup=BeautifulSoup(数据'lxml')
>>>
>>>table=soup.find(lambda标记:tag.name==“table”和tag.text中的“部分文本”)
>>>打印(表格)
此文本包含文本的一部分
其他一些文本
发布html代码和您想要创建的输出。编辑您的问题。感谢@alecxe,我编写了代码并更新了问题。感谢,我编写了以下代码:table=soup.find(lambda tag:tag.name==“td”和“search”在tag.text中)。parent.parent但我不想硬编码双亲元素来查找表,知道吗?@EnnyRodríguez等等,如果您可以使用答案中提供的方法-直接获取表,为什么要转到td
,然后向上?好吧,你可以选择使用.find_parent(“table”)
,如果你愿意的话。我不知道为什么,在这种情况下,我对bs4有点迷茫,但是当我用我的html文件在答案中尝试你的代码时,它只在删除html内容中的第一个表时起作用,不知道为什么。。。。如果我不删除第一个表标记,它将返回所有html,而不是它找到的表。。。也许是html文件结构?@EnnyRodríguez啊,对,这是因为你有嵌套的表。您可以改进您的解决方案,并获得没有任何其他表子元素的表元素:soup.find(lambda tag:tag.name==“table”而不是tag.table和tag.text中的“search”)
。多亏了您,我找到了这样的解决方案:soup=BeautifulSoup(html\u content,“lxml”)table=soup.table.find(lambda tag:tag.name==“table”和tag.text中的“Relación de Clientes”)
soup.find_all(name='tr', text=re.compile('this is part or full text of tr'))
soup.find(lambda tag: tag.name == "table" and "part of text" in tag.text)
>>> from bs4 import BeautifulSoup
>>>
>>> data = """
... <body>
... <table>
... <tr>
... <td>This text has a part of text</td>
... </tr>
... <tr>
... <td>Some other text</td>
... </tr>
... </table>
...
... <table>
... <tr>
... <td>Different table</td>
... </tr>
... </table>
... </body>
...
... """
>>>
>>> soup = BeautifulSoup(data, 'lxml')
>>>
>>> table = soup.find(lambda tag: tag.name == "table" and "part of text" in tag.text)
>>> print(table)
<table>
<tr>
<td>This text has a part of text</td>
</tr>
<tr>
<td>Some other text</td>
</tr>
</table>