Python 使用bs4仅从Wiktionary中提取一部分元素
我只打印了h2和h3标签。。但是我想要从第一个h2到第二个h2标记的每个元素(这些标记中的数据只与英语相关)。然后,我想检查诸如名词、动词之类的类别的数据,如果它们存在,请打印出来。我被困在这里了。 这就是我到目前为止写的Python 使用bs4仅从Wiktionary中提取一部分元素,python,bs4,Python,Bs4,我只打印了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.te
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表达式,而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可能是一个很高的障碍,但是一旦你对它有了足够的了解,那么它所解决的所有问题都是值得努力的。firebug有一个名为“firepath”的插件,它允许您检查一个元素并为其获取一个可能的xpath表达式,然后针对正在访问的页面尝试随机xpath表达式。这对学习和调试有很大帮助 那么githubUhmm呢,不。项目中说我必须用一个可能的复制品来做,非常感谢。它确实有效,但我的项目说我必须用beautifulsoup来做。这可能吗?我开始认为wiktionary有一些糟糕的有组织的标记,我确信它可以使用bs4和python的基本功能的某种组合。您只需要找出一个策略来导航他们的模式,并且可以像任何嵌套列表和哈希树一样遍历它。由于您已经了解了如何在bs4中导航到文档的正确常规区域,因此可以递归地扫描整个树,查找所需的任何元素。这是我在学习xpath之前经常做的:)嗨,我知道这与主题无关,但我是如何听取您的建议并开始学习lxml的。但是我无法解决这个问题>我不知道如何提取标签中的文本,但是在标签之后,像这样: