使用 bs4 仅从 Wiktionary 中提取一部分元素

Extract only a portion of elements from Wiktionary using bs4

我设法只打印出了 h2 和 h3 标签。但是我想要从第一个 h2 到第二个 h2 标签的每个元素(这些标签中的数据仅与英语相关)。Like in this picture然后,我想检查名词、动词等类别的数据,如果它们存在——打印出来。在这里被困得很厉害。 这是我到目前为止写的

url = 'https://en.wiktionary.org/wiki/dog'
r = requests.get(url,headers={'User-agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64)'})
data = r.text
soup = BeautifulSoup(data)

content = soup.find_all('span',{'class':'mw-headline'})
for item in content:
    print item.text

您可能希望为此使用 lxml.etree,因为它可以让您使用非常适合此类事情的 xpath 表达式。 bs4 和 etree 通常在同一个应用程序中一起使用,bs4 用于 bs4 使之变得简单的东西,而 etree 用于受益于 xpath 的东西。

下面是一个示例,说明如何使用 etree 和 xpath select 您想要的元素。您可以调整它以从每个元素中提取您想要的数据。

import requests
from lxml import etree

url = """https://en.wiktionary.org/wiki/dog"""
r = requests.get(url)
h = etree.HTMLParser()

tree = etree.fromstring(r.text,h)

xp = """//div[h2[span[@id='English']]]/*[count(preceding-sibling::h2)=1]"""
elements = tree.xpath(xp)

for e in elements:
    inner = e.xpath("""span[@class='mw-headline']""")
    for i in inner:
        print(i.text)

开始使用 xpath 可能是一个很高的障碍,但是一旦您全神贯注于它,它就解决了所有问题,因此付出的努力是值得的。 firebug 有一个名为 "firepath" 的插件,它允许您检查一个元素并为它获取一个可能的 xpath 表达式,并针对您正在访问的页面尝试随机 xpath 表达式。对学习和调试有很大的帮助。 https://addons.mozilla.org/en-US/firefox/addon/firepath/