Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过beautifulsoup4中的文本内容获取标记元素_Python_Html_Beautifulsoup - Fatal编程技术网

Python 如何通过beautifulsoup4中的文本内容获取标记元素

Python 如何通过beautifulsoup4中的文本内容获取标记元素,python,html,beautifulsoup,Python,Html,Beautifulsoup,我不得不从上千个站点、本地HTML文件中删除数据,复杂的是这些站点就像90年代的结构,几乎相同的嵌套表结构,没有id的noCSS类只有嵌套表,我如何在一个tr标记中选择文本中的特定表基 XPath不是一个解决方案,因为站点主要是相同的结构,但并不总是具有相同的表顺序,所以我正在寻找一种方法来从所有站点中提取这些表数据,选择或搜索某些表b中的一些文本,并由此获得父标记 有什么想法吗 每个页面上的代码都非常庞大,这里是结构示例,数据并不总是在同一个表位置 更新: 多亏了alecxe,我编写了这段代码

我不得不从上千个站点、本地HTML文件中删除数据,复杂的是这些站点就像90年代的结构,几乎相同的嵌套表结构,没有
id
的no
CSS
类只有嵌套表,我如何在一个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>