从html中提取结构化数据的模块和命令行实用程序

hext的Python项目详细描述


hext-从html中提取数据

Hext Logo

hext是一种特定于领域的语言,用于从html中提取结构化数据。它可以被认为是模板的对应物,模板通常被web开发人员用来构建web上的内容。

一个简单的例子

下面的Hext snippet收集了所有的超链接,并提取出了ref和可点击的文本

<a href:link @text:title />

Hext是通过递归地尝试匹配每个HTML元素来实现的在上面的例子中,元素需要有标记a和名为ref的属性。如果元素匹配,则其属性ref和文本表示分别存储为link和title

如果上面的Hext snippet应用于这段HTML:

<body>
  <a href="one.html">  Page 1</a>
  <a href="two.html">  Page 2</a>
  <a href="three.html">Page 3</a>
</body>

hext将产生以下值:

{ "link": "one.html",   "title": "Page 1" },
{ "link": "two.html",   "title": "Page 2" },
{ "link": "three.html", "title": "Page 3" }

可以在Hext’s live code editor中使用此示例。 请访问Hext’s documentation及其“How Hext Matches Elements”部分以获得更详细的解释

部件

此套餐包括:

  • Hext Python模块
  • htmlext命令行实用程序

对Python使用Hext

模块公开三个接口:

  • html = hext.Html("<html>...</html>")->;对象
  • rule = hext.Rule("...")->;对象
  • rule.extract(html)->;字符串字典{string->;string}
import hext
import requests
import json

res = requests.get('https://news.ycombinator.com/')
res.raise_for_status()

# hext.Html's constructor expects a single argument
# containing an UTF-8 encoded string of HTML.
html = hext.Html(res.text)

# hext.Rule's constructor expects a single argument
# containing a Hext snippet.
# Throws an exception of type ValueError on invalid syntax.
rule = hext.Rule("""
<tr>
  <td><span @text:rank /></td>
  <td><a href:href @text:title /></td>
</tr>
<?tr>
  <td>
    <span @text:score />
    <a @text:user />
    <a:last-child @text:filter(/\d+/):comment_count />
  </td>
</tr>""")

# hext.Rule.extract expects an argument of type hext.Html.
# Returns a list of dictionaries.
result = rule.extract(html)

# Print each dictionary as JSON
for map in result:
    print(json.dumps(map, ensure_ascii=False,
                          separators=(',',':')))

在命令行上使用Hext

hext附带一个名为htmlext的命令行实用程序,它将hext片段应用于html文档并输出json。

htmlext - Extract structured content from HTML.

Usage:
  htmlext [options] <hext-file> <html-file...>
      Apply extraction rules from <hext-file> to each
      <html-file> and print the captured content as JSON.

Options:
  -x [ --hext ] <file>  Add Hext from file
  -i [ --html ] <file>  Add HTML from file
  -s [ --str ] <string> Add Hext from string
  -c [ --compact ]      Print one JSON object per line
  -p [ --pretty ]       Pretty-print JSON
  -a [ --array ]        Wrap results in a JSON array
  -f [ --filter ] <key> Print values whose name matches <key>
  -l [ --lint ]         Do Hext syntax check
  -h [ --help ]         Print this help message
  -V [ --version ]      Print info and version

有没有想过在vlc中观看/r/videos上的提交?好吧,看看这个小家伙:

htmlext \
  -i <(wget -O- -o/dev/null "https://old.reddit.com/r/videos/") \
  -s '<a class="title" href:x />' \
  -f x \
  | xargs vlc

许可证

Hext是根据apache许可证v2.0的条款发布的。源代码托管在Github上。 此二进制软件包包含由第三方编写的内容:

  • gumbo-parser。版权所有2010谷歌公司。见gumbo.license。
  • rapidjson版权所有(C)2015 THL A29有限公司(腾讯公司)和Milo Yip见rapidjson.license

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

推荐PyPI第三方库


热门话题
Java中ArrayList的超简单问题   Java 8在一段时间后过期   java如何创建具有用户定义维度的矩阵,并使用从上到下、从左到右的递增值填充它?   java从JDBC重启mysql   带有sqlite的java LiveData未更新UI   带有JDialog的java小程序在Mac OSX中未正确隐藏   java ActionListener无法从公共类引用数组?   java Apache Digester:NoSuchMethodException:没有这样的可访问方法   安卓中数据库中的java数据没有以正确的格式检索   java快速排序实现:使用random pivot时几乎排序   安卓 Java:高效的ArrayList过滤?   java如何在单独的文件中制作GUI程序   jasper报告如何从JSP或Java代码在JasperReport中传递参数值?