如何从***中获取纯文本

Posted

技术标签:

【中文标题】如何从***中获取纯文本【英文标题】:How to get plain text out of Wikipedia 【发布时间】:2011-05-26 00:35:28 【问题描述】:

我想编写一个仅获取 Wikipedia 描述部分的脚本。也就是说,当我说

/wiki bla bla bla

它会去Wikipedia page for bla bla bla,得到以下内容,然后返回聊天室:

“Bla Bla Bla”是一首歌的名字 吉吉·达戈斯蒂诺制作。他描述了 这首歌是“我写的一段思考 在所有说话和说话的人中 什么都不说”。 突出但荒谬的声音 样品取自英国乐队 Stretch 的歌曲《你为什么这样做》

我该怎么做?

【问题讨论】:

所以要提取第一段? 我对@9​​87654322@ 的回答可能会对您有所帮助。 API 的 TextExtracts 扩展允许或多或少地从文章中提取纯文本。 Extract the first paragraph from a Wikipedia article (Python)的可能重复 【参考方案1】:

您可以使用 Python 的 wikipedia 包,特别是给定页面的 content 属性。

来自文档:

>>> import wikipedia
>>> print wikipedia.summary("Wikipedia")
# Wikipedia (/ˌwɪkɨˈpiːdiə/ or /ˌwɪkiˈpiːdiə/ WIK-i-PEE-dee-ə) is a collaboratively edited, multilingual, free Internet encyclopedia supported by the non-profit Wikimedia Foundation...

>>> wikipedia.search("Barack")
# [u'Barak (given name)', u'Barack Obama', u'Barack (brandy)', u'Presidency of Barack Obama', u'Family of Barack Obama', u'First inauguration of Barack Obama', u'Barack Obama presidential campaign, 2008', u'Barack Obama, Sr.', u'Barack Obama citizenship conspiracy theories', u'Presidential transition of Barack Obama']
>>> ny = wikipedia.page("New York")
>>> ny.title
# u'New York'
>>> ny.url
# u'http://en.wikipedia.org/wiki/New_York'
>>> ny.content
# u'New York is a state in the Northeastern region of the United States. New York is the 27th-most exten'...

【讨论】:

【参考方案2】:

或者,您可以像这样尝试加载任何 wiki 页面的文本 https://bn.wikipedia.org/w/index.php?title=User:ShohagS&action=raw&ctype=text

bn 更改为您的wiki 语言,User:ShohagS 将是页面名称。在您的情况下使用: https://en.wikipedia.org/w/index.php?title=Bla_bla_bla&action=raw&ctype=text

在浏览器中,这将返回一个 php 格式的文本文件。

【讨论】:

【参考方案3】:

首先检查here。

MediaWiki 的文本标记中有很多无效语法。 (用户犯的错误......) 只有 MediaWiki 可以解析这个地狱般的文本。 但是在上面的链接中仍然有一些替代方法可以尝试。 不完美,但总比没有好!

【讨论】:

【参考方案4】:

DBPedia 是这个问题的完美解决方案。在这里:http://dbpedia.org/page/Metallica,查看使用 RDF 完美组织的数据。可以使用 RDF 的查询语言 SPARQL 在http://dbpedia.org/sparql 查询任何内容。总有一种方法可以找到 pageID 以获取描述性文本,但大多数情况下应该这样做。

RDF 和 SPARQL 将有一个学习曲线来编写任何有用的代码,但这是完美的解决方案。

例如,对Metallica 运行的查询会返回一个 html 表格,其中包含几种不同语言的摘要:

<table class="sparql" border="1">
  <tr>
    <th>abstract</th>
  </tr>
  <tr>
    <td><pre>"Metallica is an American heavy metal band formed..."@en</pre></td>
  </tr>
  <tr>
    <td><pre>"Metallica es una banda de thrash metal estadounidense..."@es</pre></td>
... 

SPARQL 查询:

PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbpprop: <http://dbpedia.org/property/>
PREFIX dbres: <http://dbpedia.org/resource/>

SELECT ?abstract WHERE 
 dbres:Metallica dbpedia-owl:abstract ?abstract.

将“Metallica”更改为任何资源名称(资源名称在 wikipedia.org/resourcename 中)以查询与摘要相关的内容。

【讨论】:

【参考方案5】:

您可以获取文本格式的 wiki 数据。如果您需要访问多个标题的信息,您可以在一次调用中获取所有标题的 wiki 数据。使用竖线 (|) 分隔每个标题。

http://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exlimit=max&explaintext&exintro&titles=Yahoo|Google&redirects=

此 api 调用返回 Google 和 Yahoos 数据。

explaintext => 将提取的内容返回为纯文本而不是有限的 HTML。

exlimit = max(现在是 20);否则只会返回一个结果。

exintro => 只返回第一部分之前的内容。如果您想要完整的数据,只需将其删除即可。

redirects= 解决重定向问题。

【讨论】:

【参考方案6】:

这里有几种不同的可能方法;使用适合您的。我在下面的所有代码示例都使用requests 对 API 的 HTTP 请求;如果你有 Pip,你可以安装 requestspip install requests。他们也都使用Mediawiki API,两个使用query端点;如果您需要文档,请点击这些链接。

1。使用 extracts 属性直接从 API 中获取整个页面或页面“提取”的纯文本表示

请注意,此方法仅适用于带有 TextExtracts extension 的 MediaWiki 站点。这尤其包括***,但不包括一些较小的 Mediawiki 网站,例如 http://www.wikia.com/

您想点击类似的网址

https://en.wikipedia.org/w/api.php?action=query&format=json&titles=Bla_Bla_Bla&prop=extracts&exintro&explaintext

分解后,我们有以下参数(记录在https://www.mediawiki.org/wiki/Extension:TextExtracts#query+extracts):

action=queryformat=jsontitle=Bla_Bla_Bla 都是标准的 MediaWiki API 参数 prop=extracts 让我们使用 TextExtracts 扩展 exintro 将响应限制在第一节标题之前的内容 explaintext 使响应中的提取成为纯文本而不是 HTML

然后解析 JSON 响应并提取提取:

>>> import requests
>>> response = requests.get(
...     'https://en.wikipedia.org/w/api.php',
...     params=
...         'action': 'query',
...         'format': 'json',
...         'titles': 'Bla Bla Bla',
...         'prop': 'extracts',
...         'exintro': True,
...         'explaintext': True,
...     
... ).json()
>>> page = next(iter(response['query']['pages'].values()))
>>> print(page['extract'])
"Bla Bla Bla" is the title of a song written and recorded by Italian DJ Gigi D'Agostino. It was released in May 1999 as the third single from the album, L'Amour Toujours. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with L'Amour Toujours (I'll Fly With You) in its US radio version.

2。使用parse端点获取页面的完整HTML,解析它,提取第一段

MediaWiki 有一个parse endpoint,您可以使用https://en.wikipedia.org/w/api.php?action=parse&page=Bla_Bla_Bla 之类的URL 来获取页面的HTML。然后,您可以使用lxml 之类的 HTML 解析器对其进行解析(首先使用 pip install lxml 安装它)以提取第一段。

例如:

>>> import requests
>>> from lxml import html
>>> response = requests.get(
...     'https://en.wikipedia.org/w/api.php',
...     params=
...         'action': 'parse',
...         'page': 'Bla Bla Bla',
...         'format': 'json',
...     
... ).json()
>>> raw_html = response['parse']['text']['*']
>>> document = html.document_fromstring(raw_html)
>>> first_p = document.xpath('//p')[0]
>>> intro_text = first_p.text_content()
>>> print(intro_text)
"Bla Bla Bla" is the title of a song written and recorded by Italian DJ Gigi D'Agostino. It was released in May 1999 as the third single from the album, L'Amour Toujours. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with L'Amour Toujours (I'll Fly With You) in its US radio version.

3。自己解析 wikitext

您可以使用query API 获取页面的wikitext,使用mwparserfromhell 解析它(首先使用pip install mwparserfromhell 安装它),然后使用strip_code 将其缩减为人类可读的文本。 strip_code 在撰写本文时并不完美(如下例所示),但有望改进。

>>> import requests
>>> import mwparserfromhell
>>> response = requests.get(
...     'https://en.wikipedia.org/w/api.php',
...     params=
...         'action': 'query',
...         'format': 'json',
...         'titles': 'Bla Bla Bla',
...         'prop': 'revisions',
...         'rvprop': 'content',
...     
... ).json()
>>> page = next(iter(response['query']['pages'].values()))
>>> wikicode = page['revisions'][0]['*']
>>> parsed_wikicode = mwparserfromhell.parse(wikicode)
>>> print(parsed_wikicode.strip_code())
dablink|For Ke$ha's song, see Blah Blah Blah (song). For other uses, see Blah (disambiguation)

"Bla Bla Bla" is the title of a song written and recorded by Italian DJ Gigi D'Agostino. It was released in May 1999 as the third single from the album, L'Amour Toujours. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with L'Amour Toujours (I'll Fly With You) in its US radio version.

Background and writing
He described this song as "a piece I wrote thinking of all the people who talk and talk without saying anything". The prominent but nonsensical vocal samples are taken from UK band Stretch's song "Why Did You Do It"''.

Music video
The song also featured a popular music video in the style of La Linea. The music video shows a man with a floating head and no arms walking toward what appears to be a shark that multiplies itself and can change direction. This style was also used in "The Riddle", another song by Gigi D'Agostino, originally from British singer Nik Kershaw.

Chart performance
Chart (1999-00)PeakpositionIreland (IRMA)Search for Irish peaks23

References

External links


Category:1999 singles
Category:Gigi D'Agostino songs
Category:1999 songs
Category:ZYX Music singles
Category:Songs written by Gigi D'Agostino

【讨论】:

只要确保您的“标题”没有大写。例如,“数据集成”返回错误,但“数据集成”有效。 @Cyber​​netic 更准确地说,确保它们的大写方式与***的大写方式相同。对于专有名词,这通常意味着将每个单词都大写,但对于不是专有名词的标题,通常意味着只将第一个单词大写。 这个答案颠覆了公认的答案。太棒了。 wikipedia api description actually is 的难度让我很恼火。例如,它从来没有提到过 prop 参数。【参考方案7】:

你可以试试 WikiExtractor:http://medialab.di.unipi.it/wiki/Wikipedia_Extractor

适用于 Python 2.7 和 3.3+。

【讨论】:

【参考方案8】:

我认为更好的选择是使用为您提供 MediaWiki API 的 extracts 属性。它只返回一些标签(b、i、h#、span、ul、li)并删除表格、信息框、引用等。

http://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Bla%20Bla%20Bla&format=xml 给你一些非常简单的东西:

<api><query><pages><page pageid="4456737" ns="0" title="Bla Bla Bla"><extract xml:space="preserve">
<p>"<b>Bla Bla Bla</b>" is the title of a song written and recorded by Italian DJ Gigi D'Agostino. It was released in May 1999 as the third single from the album, <i>L'Amour Toujours</i>. It reached number 3 in Austria and number 15 in France. This song can also be heard in an added remixed mashup with <i>L'Amour Toujours (I'll Fly With You)</i> in its US radio version.</p> <p></p> <h2><span id="Background_and_writing">Background and writing</span></h2> <p>He described this song as "a piece I wrote thinking of all the people who talk and talk without saying anything". The prominent but nonsensical vocal samples are taken from UK band Stretch's song <i>"Why Did You Do It"</i>.</p> <h2><span id="Music_video">Music video</span></h2> <p>The song also featured a popular music video in the style of La Linea. The music video shows a man with a floating head and no arms walking toward what appears to be a shark that multiplies itself and can change direction. This style was also used in "The Riddle", another song by Gigi D'Agostino, originally from British singer Nik Kershaw.</p> <h2><span id="Chart_performance">Chart performance</span></h2> <h2><span id="References">References</span></h2> <h2><span id="External_links">External links</span></h2> <ul><li>Full lyrics of this song at MetroLyrics</li> </ul>
</extract></page></pages></query></api>

然后你可以通过正则表达式运行它,在 javascript 中会是这样的(也许你必须做一些小的修改:

/^.*<\s*extract[^>]*\s*>\s*((?:[^<]*|<\s*\/?\s*[^>hH][^>]*\s*>)*).*<\s*(?:h|H).*$/.exec(data)

这给了你(只有段落,粗体和斜体):

Bla Bla Bla”是一首由意大利 DJ Gigi D'Agostino 创作和录制的歌曲的标题。它于 1999 年 5 月作为专辑 L'Amour Toujours 的第三首单曲发行。它在奥地利排名第 3,在法国排名第 15。这首歌也可以在美国电台版本中与 L'Amour Toujours (I'll Fly With You) 混搭后听到。

【讨论】:

【参考方案9】:

还有机会通过 JSONpedia 之类的包装 API 使用 Wikipedia 页面,它既可以实时工作(询问 Wiki 页面的当前 JSON 表示形式),也可以基于存储(查询以前在 Elasticsearch 和 MongoDB 中提取的多个页面) )。 输出 JSON 还包括纯呈现的页面文本。

【讨论】:

【参考方案10】:

"...仅获取 Wikipedia 描述部分的脚本..."

对于您的应用程序,您可能需要查看转储文件,例如:http://dumps.wikimedia.org/enwiki/20120702/

您需要的特定文件是“抽象”XML 文件,例如,这个小文件 (22.7MB):

http://dumps.wikimedia.org/enwiki/20120702/enwiki-20120702-abstract19.xml

XML 有一个名为“抽象”的标签,其中包含每篇文章的第一部分。

否则 wikipedia2text 使用例如 w3m 来下载带有扩展和格式化为文本的模板的页面。从中您也许可以通过正则表达式挑选出摘要。

【讨论】:

【参考方案11】:

使用在***上运行的MediaWiki API。您必须自己对数据进行一些解析。

例如:

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&&titles=Bla%20Bla%20Bla

means

以 JSON 格式 (format=json) 获取 (action=query) 主页 (title=Main%20Page) 的最新版本的内容 (rvprop=content)。

您可能希望搜索查询并使用第一个结果来处理拼写错误等。

【讨论】:

这很有帮助。但我仍然不明白我应该怎么做 @Wifi:我不会给你写代码的!您需要使用urllib 转到一个特殊的URL,如上面的那个,然后使用json 来解析结果。您可以使用我上面链接的文档确定需要访问的 URL。【参考方案12】:

您可以使用 API 仅获取第一部分:

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvsection=0&titles=Bla%20Bla%20Bla&rvprop=content

这将为您提供原始 wikitext,您必须处理模板和标记。

或者您可以获取呈现为 HTML 的整个页面,就解析而言,它有自己的优点和缺点:

http://en.wikipedia.org/w/api.php?action=parse&prop=text&page=Bla_Bla_Bla

我看不到在一次调用中获取第一部分的解析 HTML 的简单方法,但您可以通过两次调用来完成,方法是将您从第一个 URL 收到的 wikitext 传递回来,并使用 text= 代替page= 在第二个 URL 中。

更新

抱歉,我忽略了您问题的“纯文本”部分。以 HTML 格式获取您想要的文章部分。剥离 HTML 比剥离 wikitext 更容易

【讨论】:

【参考方案13】:

您可以尝试 Python 的 BeautifulSoup HTML 解析库,但您必须编写一个简单的解析器。

【讨论】:

以上是关于如何从***中获取纯文本的主要内容,如果未能解决你的问题,请参考以下文章

如何从纯文本文件中获取字符串[重复]

如何从 Node.js IMAP 模块中的正文获取纯文本

如何使用 Scrapy 从网站获取所有纯文本?

如何从summernote编辑器获取纯文本?

如何删除所有标签并获取纯文本?

如何使用 javascript 将网页作为纯文本获取,而没有任何 html? [复制]