Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用bs4仅从Wiktionary中提取一部分元素_Python_Bs4 - Fatal编程技术网

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

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

我只打印了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

您可能希望使用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的。但是我无法解决这个问题>我不知道如何提取标签中的文本,但是在标签之后,像这样:
  • 这里有一些文本,我需要假设我在评论窗口中正确地阅读它,根据你那里的内容,一些事情会起作用。想到的两个最快的例子是//b/text(),//li[@id='list]/b[1]/text()。这些内容是“文档中每个b元素的测试”和“文档中每个li中属性id=list的第一个b的文本”。我建议将文档加载到firebug中。它将为您提供至少一个可以调整的工作示例。当然,如果它出现在一个更大的文档中,这些可能会改变。在英语中,这两个单词是“文档中每个‘b’元素的文本’和tAlways都记住,您还可以使用普通python进行分解或过滤,并且可以来回切换,使用xpath导航某些部分,使用lxml和bs4中的其他导航器函数导航其他部分。例如,您可以执行//b来获取所有的b,然后在生成的python列表中的元素上循环,从每个元素打印e.text。