获取标记中的所有文本,除非它位于另一个标记中

时间:2016-11-06 12:21:32

标签: python html beautifulsoup

我正在尝试使用BeautifulSoup解析一些HTML,并且我想在标记中获取所有文本(递归),但我想忽略small标记内显示的所有文本。例如,这个HTML:

<li>
  <a href="/path">
    Final
  </a>
  definition.
  <small>
    Fun fact.
  </small>
</li>

应该给出文本Final definition.请注意,这是一个最小的例子。在真实的HTML中,还涉及许多其他标记,因此应排除small而不是a

标记的text属性接近我想要的内容,但它包含Fun fact.我可以连接除small标记之外的所有子项的文本,但这会留下out definition.我找不到像get_text_until这样的方法(small标记总是在最后),所以我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以使用您不想递归到子标记的递归方法状态来获取此信息: 喜欢

soup.li.find(text=True, recursive=False)

所以你可以这样做

' '.join(li.find(text=True, recursive=False) for li in soup.findAll('li', 'a'))

答案 1 :(得分:1)

您可以使用find_all查找所有<small>代码,清除它们,然后使用get_text()

>>> soup

<li>
<a href="/path">
    Final
  </a>
  definition.
  <small>
    Fun fact.
  </small>
</li>

>>> for el in soup.find_all("small"):
...     el.clear()
...
>>> soup

<li>
<a href="/path">
    Final
  </a>
  definition.
  <small></small>
</li>

>>> soup.get_text()
'\n\n\n    Final\n  \n  definition.\n  \n\n'