0

我设法只打印了 h2 和 h3 标签。但我想要从第一个 h2 到第二个 h2 标签的每个元素(这些标签中的数据仅与英语有关)。就像在这张图片中然后,我想检查名词,动词等类别的数据,如果它们存在 - 将它们打印出来。在这里被卡住了。这是我到目前为止写的

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
4

1 回答 1

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”的 firebug 插件,它可以让您检查一个元素并为其获取一个可能的 xpath 表达式,并针对您正在访问的页面尝试随机 xpath 表达式。它对学习和调试有很大帮助。 https://addons.mozilla.org/en-US/firefox/addon/firepath/

于 2015-10-10T19:59:00.930 回答