从url和html文档中解析元数据的模块

metadata-parser的Python项目详细描述


metadataparser是一个python模块,用于从web文档中提取元数据。



安装
==





安装建议
=====


我强烈建议您使用"请求"库版本2.4.3或更高版本

这不是必需的,但更好。在早期版本中,当存在底层重定向/404时,可能会出现未捕获的解码错误异常。最近对"requests"的修复改进了重定向处理、urllib3和urllib3错误。



features
==


*它从文档中提取尽可能多的元数据
*您可以设置查找元数据的"策略"(即仅接受opengraph或页面属性)
*lig重量但功能性(!)url验证
*日志记录是冗长的,但嵌套在`\u debug\uu`语句下,因此当设置pythonoptimize时,它会被编译掉

==1。这需要美化组4。
2。为了提高速度,它将用lxml实例化一个beautifulsoup解析器,如果不能加载lxml
3,则返回"none"(内部纯python)。URL验证不符合RFC,但尝试符合"真实世界"

*强烈建议您安装LXML以供使用。它要快得多。相当快。*

您还应该使用最新版本的lxml。我在某些版本上遇到了segfults问题<;2.3.x;如果可能的话,我建议使用最新的3.x。


默认的"策略"是按以下顺序查找:


og,dc,meta,page
og=opengraph
dc=dublincore
meta=metadata
page=page elements

您可以将策略指定为以上内容的逗号分隔列表。



"metadata"元素受"name"和"property"支持。


metadataparser对象还包装了一些方便的函数,这些函数可以在其他情况下使用,其目的是将指称的URL转换为格式良好的URL。

//www.example.com/path/to/file.html

,该文件指示一个规范URL,它是简单的"/file.html"。

此包将尝试将规范URL"重新装载"到"http://www.example.com/file.html"的绝对URL。如果最终结果不是有效的url,则返回none。

这与RFC不兼容。

RFC中存在一些允许"奇怪行为"的间隙。几乎这个包的任何用例都需要/期望"在野外"解析url的规则,而不是理论上的规则。

.
默认行为是使这些主机无效:
http://256.256.256.256
http://999.999.999.999
根据RFC,这些主机名将作为"IP地址"失败,但作为"域名"传递。然而在现实世界中,人们永远不会遇到这样的域名。

*唯一允许的非域主机名是"localhost"
默认行为是使这些主机无效:
http://example
http://examplecom
这些主机被视为有效主机,可能存在于本地网络或自定义主机文件中。然而,它们并不是公共互联网的一部分。

尽管这种行为破坏了rfc,但它大大减少了分析网页时生成的"误报"数量。如果要包含错误数据,可以将kwarg提交给"metadataparser."处理错误的url和编码的uri



ost网站发布者将图像定义为url

<;meta property="og:image"content="http://example.com/image.jpg"/>;


>有些将图像定义为编码的uri

<;meta property="og:image"content="data:image/png;base64,ivborw0kggoaaansuheugaaaaaaaaabcaqaaac1hawcaaaaacoleqvr42mnm+q8aac0bzx6f84gaaaasuvork5cyii="/>;

默认情况下,可以使用"get_metadata_link()"方法确保从元数据负载中提取有效的链接

>;>;导入元数据解析器
>;>;page=metadata解析器.metadataparser(url="http://www.example.com")
>>gt;打印页。get_metadata_link('image')


此方法接受kwarg"allow_encoded_uri"(默认为false)将返回图像而无需进一步处理:

>>gt;打印页。get_metadata_link('image',allow_encoded_ uri=true)

类似地,如果url是本地的……

<;meta property="og:image"content="/image.jpg"/>;




"获取元数据链接"方法将自动将其升级到域:

>;打印页。获取元数据链接('image')
http://example.com/image.jpg




此包尝试修复此问题。

默认情况下,"metadataparser"是用"require_public_netloc=true"和"allow_localhosts=true"构造的。



例如,这些都是有效的url:

http://example.com
http://1.2.3.4
http://localhost
http://127.0.0.1
http://0.0.0.0

r/>http://localhost
http://127.0.0.1
http://0.0.0.0

参数"require_public_global",默认为"true"。

ocalhost:8000'作为不正确的规范url,并将本地部分"/alt path/to/foo"重新装载到为文件提供服务的域上。绝大多数情况下,遇到这种"行为"时,这是预期的规范。

print page.get_discrete_url()
>;>;http://example.com/alt path/to/foo


.get_discrete_url()
>;>http://localhost:8000/alt path/to/foo

oo

警告
===


1.0将是一次完整的api大修。锁定您的版本以避免悲伤。



<0.9.19版本中断更改e 12暴露了现有包中的一些缺陷

1。` metadataparser.get_metadatas `替换为metadataparser.get_metadata `
=-


0.9.19版之前,建议使用"get_metadata"获取元数据,该方法将返回字符串(或不返回字符串)。

0.9.19版开始,建议使用gET元数据将使用"get_metadatas",它将始终返回一个列表(或不返回任何列表)。


此更改是因为库在存在重复项时错误地存储了单个元数据键值。


2。"parsedresult"负载存储混合内容,并跟踪其版本
在使用全列表格式和混合格式(字符串或列表)测试各种有效负载之后,混合格式的有效负载大小要小得多,性能影响可以忽略不计。新的"v"属性跟踪负载版本。将来,没有"v"属性的有效载荷将被解释为预版本控制格式。

3。` dublincore`有效负载可能是dict
<-

添加测试来处理dublincore数据。可能需要一个额外的属性才能正确地表示有效负载,因此始终返回至少包含名称+内容的dict(可能还有"lang"或"scheme"是最好的方法。





使用"获取元数据"将返回字符串(或无):

**来自URL**

>tadatas('title')
>;>gt;打印页。获取元数据('title',strategy=['og',])
>;>gt;打印页。获取元数据('title',strategy=['page','og','dc',])

**来自html**

>;>html="<;here>;""
>;>page=metadata\parser.metadataparser(html=html)
>;>;打印页。元数据
>;>;打印页。获取元数据('title')
>;>;打印页。获取元数据('title',strategy=['og',])
>;>;打印页。获取元数据('title',strategy=['page','og','dc',])


医学数据
==========


查找格式错误的数据非常常见。从"0.9.20"版本起,应使用以下方法允许格式不正确的表示:

>;>;page=metadata parser.metadataparser(html=html,支持格式不正确的=true)




>;>;parsed=page.parse(html=html,支持格式不正确的=true)
>;。>;parsed=page.parse(html=html,support_malformed=false)

上述选项将支持分析常见的格式错误选项。目前,这只关注生成twitter标记的替代(不正确)方法,但可能会扩展到



==


>在python3上构建时,可能需要一个"静态"顶级目录

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Midlet即使按下设备的“剪切”按钮也不能关闭   JavaSpring环境。getProperty未解析   用Hibernate在Java中实现序列   具有重复键和文件写入的java映射   java显示控制台输出到JavaFXML应用程序中的TextArea   java Cucumber在编译为时无法在类路径上找到功能文件。战争   java过滤器中的servlet问题   安卓中消息和字符串之间的java转换?   java Apache POI读取单元(下午12:35:00)时间值返回1899年12月31日   Java游戏中的碰撞检测?   JSF2.0中的JavajQuery   java在setValue之后使用不同的值   java如何修复可选文件的StackOverflow错误?   如何在不使用服务器设置的情况下使用java从Outlook mail下载附件?   YAxis上Java BoxLayout中单个字符的摆动对齐偏离中心