如何根据文本的HTML结构将其分组?

时间:2018-07-26 12:19:18

标签: python html beautifulsoup

我正在处理此类html处理问题,以便根据文本的结构将文本分组。原始文件非常复杂,因此我将其简化如下: 我有名单:['Json Bell','Jim Charlie','Mike Alfie','William Cyphort','Juniper Egbert']

和html文件:

 <p>studets</p>
    <ul>
      <li>Json Bell</li>
      <li>Jim Charlie</li>
      <li>Mike Alfie</li> 
    </ul>
    <p>teachers</p>
    <ul>
      <li>William Cyphort</li>
      <li>Juniper Egbert</li>
    </ul>

我如何获得分组['Json Bell','Jim Charlie','Mike Alfie'],['William Cyphort','Juniper Egbert']

任何想法都会受到欢迎!我对python很熟悉,所以python中的处理方法会更好。

问题可以用另一种方式描述:如何知道字符串是否具有相同的父节点。

1 个答案:

答案 0 :(得分:0)

对于这个问题,我将使用列表理解-首先选择所有<ul>标签,然后为每个ul标签选择所有li标签并提取文本:

data = """
 <p>studets</p>
    <ul>
      <li>Json Bell</li>
      <li>Jim Charlie</li>
      <li>Mike Alfie</li>
    </ul>
    <p>teachers</p>
    <ul>
      <li>William Cyphort</li>
      <li>Juniper Egbert</li>
    </ul>"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')

print([[li.text for li in ul.select('li')] for ul in soup.select('ul')])

输出为:

[['Json Bell', 'Jim Charlie', 'Mike Alfie'], ['William Cyphort', 'Juniper Egbert']]

编辑:

要比较父母,您可以使用.parent属性:

tag1 = soup.find(text='Json Bell')
tag2 = soup.find(text='Jim Charlie')

print(tag1.parent == tag2.parent)   #tag1 and tag2 parents are <li> tags (different)
print(tag1.parent.parent == tag2.parent.parent)   #this compares <ul> tags, which are the same

此打印:

False
True

注意:soup.find(text='Json Bell')查找NavigableString类。该NavigableString的父级是<li>标记。 <li>标签的父标签是<ul>标签,依此类推...