python - 如何着手识别 HTML 树中语义相关但结构不相关的节点

标签 python html beautifulsoup html-parsing

我面临以下问题,因为看起来 Wiktionary 上的 HTML 的布局方式是,各个语言的部分实际上并不是支配相应部分条目的节点。我只想从某些特定语言的部分获取数据,比如英语。我可能感兴趣的数据是例如跨度“IPA”:<span class="IPA" lang="">/dɒɡ/</span> ,但是这个跨度出现了几次:

[<span class="IPA" lang="">/dɒɡ/</span>, <span class="IPA" lang="">/dɔɡ/</span>, <span class="IPA" lang="">/dɑɡ/</span>, <span class="IPA" lang="">-ɒɡ</span>, <span class="IPA" lang="">/ˈdɔɡ/</span>, <span class="IPA" lang="">/ˈdɔ.ɡi/</span>, <span class="IPA" lang="">[doɡ]</span>]

但只有一个项目属于英文部分。其他属于葡萄牙语和 Volapük。然而,标记英语部分 ( <span class="mw-headline" id="English">English</span> ) 的跨度不是 IPA-span 节点的前导节点,因此目前尚不清楚如何根据 HTML 解析来收集正确的数据,正如我目前所尝试的那样:

from bs4 import BeautifulSoup
import requests
from sys import argv

def find_IPA(
    r = requests.get('https://en.wiktionary.org/wiki/'+word)
    content = r.content
    soup = BeautifulSoup(content.decode('utf-8','ignore'),'lxml')
    print (soup.findAll('span', {'class' : "IPA"}))


if __name__ == '__main__':
    try:
        find_IPA(argv[1])
    except Exception as e:
        print(format(e))

那么,有没有更好的方法来处理 HTML 文件中这种语义相关性与结构相关性脱节的情况?

(示例位来自此页面> https://en.wiktionary.org/wiki/dog)

最佳答案

由于 HTML 中没有结构并且部分是扁平的并且没有 DOM 层次结构,因此一种选择是选择“English”标题,然后遍历所有下一个同级元素,直到遇到另一个 h2 元素包含一个 .mw-headline header 。

这样做实际上是在选择“英语”部分中的所有同级元素。

从那里,您可以选择所有需要的 .IPA 元素。

english_header = soup.find('span', {'id': 'English', 'class': 'mw-headline'})

if english_header:
    next_sibling = english_header.parent.find_next_sibling()

    while next_sibling and not (next_sibling.name == 'h2' and next_sibling.select('.mw-headline')):
        for element in next_sibling.select('.IPA'):
            print(element)

        next_sibling = next_sibling.find_next_sibling()

关于python - 如何着手识别 HTML 树中语义相关但结构不相关的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41916046/

相关文章:

javascript - 弹出窗口的内容未显示(或为白色)

python - 漂亮的汤 - 我们如何获取 <head> 元素之前的元素?

python - 列出超出 SEC 网络爬虫范围的索引

Python PyQt 设置滚动区域

python - 如何使用Python在音频wav/原始文件中查找高频噪声的时间?

javascript - 限制用户在当前时间之后输入 HTML &lt;input type = "time">

javascript - 如何构建类似 Gmail 的 Smart Compose?可能在文本区域?

python - 如何从包含 <span> 和美丽汤的 <div> 获取文本

Python 获取请求返回与查看源代码不同的 HTML

python - 使用递归查找最多 n 项的总和时获取 'shell returned -1073741571'