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

时间:2015-10-10 18:57:09

标签: python 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

1 个答案:

答案 0 :(得分:0)

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

以下是如何使用etree和xpath选择所需元素的示例。您可以调整它以从每个元素中提取所需的数据。

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可能是一个很大的障碍,但是一旦你绕过它就可以解决它所解决的所有问题。有一个名为" firepath"的萤火虫插件。它允许您检查元素并为其获取一个可能的xpath表达式,并针对您正在访问的页面尝试随机xpath表达式。它对学习和调试有很大帮助。 https://addons.mozilla.org/en-US/firefox/addon/firepath/