【问题标题】:Extract data between html tags using BeautifulSoup in python在python中使用BeautifulSoup提取html标签之间的数据
【发布时间】:2014-12-11 15:10:05
【问题描述】:

我想提取html标签'title'和'meta'标签之间的数据,我想提取URL属性的值以及'?'之前的文本。

<html lang="en" id="facebook" class="no_js">
<head>
    <meta charset="utf-8" />
    <script>
        function envFlush(a) {function b(c){for(var d in)c[d]=a[d];}if(window.requireLazy){window.requireLazy(['Env'],b);}else{window.Env=window.Env||{};b(window.Env);}}envFlush({"ajaxpipe_token":"AXjbmsNXDxPlvhrf","lhsh":"4AQFQfqrV","khsh":"0`sj`e`rm`s-0fdu^gshdoer-0gc^eurf-3gc^eurf;1;enbtldou;fduDmdldourCxO`ld-2YLMIuuqSdptdru;qsnunuxqd;rdoe"});
    </script>
    <script>CavalryLogger=false;</script>
    <noscript>
        <meta http-equiv="refresh" content="0; URL=/notes/kursus-belajar-bahasa-inggris/bahasa-inggris-siapa-takut-/685004288208871?_fb_noscript=1" />
    </noscript>
    <meta name="referrer" content="default" id="meta_referrer" />
    <title id="pageTitle">
        &quot; CARA CEPAT BELAJAR BAHASA INGGRIS MUDAH DAN MENYENANGKAN &quot;
    </title>
    <link rel="shortcut icon" href="https://fbstatic-a.akamaihd.net/rsrc.php/yl/r/H3nktOa7ZMg.ico" />

即CARA CEPAT BELAJAR BAHASA INGGRIS MUDAH DAN MENYENANGKAN 和 685004288208871。

我尝试了以下代码:

>>> soup.title.contents

输出是

[u'" CARA CEPAT BELAJAR BAHASA INGGRIS MUDAH DAN MENYENANGKAN "']

在此我不想要字符 '[]' 、 'u' 和单引号。

另外,关于实施以下内容:

>>> soup.meta.contents

我得到的输出为:

[]

接下来我可以尝试什么?我是 BeautifulSoup 的新手。

【问题讨论】:

  • soup.title.text 是你想要的。 u'...' 之所以存在,是因为交互式 shell 在返回值上调用 repr

标签: python html beautifulsoup extract


【解决方案1】:

Beautiful Soup 对象的.contents() 方法返回一个列表。在这种情况下,它只有一个元素,即 Unicode 字符串。你应该会发现你想要的表达式其实是

>>> soup.title.contents[0]

请注意,单引号仅出现是因为您要求交互式解释器显示字符串值。你会发现

>>> print(soup.title.contents[0])

展示

" CARA CEPAT BELAJAR BAHASA INGGRIS MUDAH DAN MENYENANGKAN "

这实际上是标题标签的内容。您将观察到 Beautiful Soup 已将&amp;quot; HTML 实体转换为所需的双引号字符。要丢失引号和相邻空格,您可以使用

soup.title.contents[0][2:-2]

元标记有点小技巧。我假设只有一个&lt;meta&gt; 标签具有http-equiv 属性,其值为"refresh", so the retrieval returns a list of one element。您可以像这样检索该元素:

>>> meta = soup.findAll("meta", {"http-equiv": "refresh"})[0]
>>> meta
<meta content="0; URL=/notes/kursus-belajar-bahasa-inggris/bahasa-inggris-siapa-takut-/685004288208871?_fb_noscript=1" http-equiv="refresh"/>

请注意,顺便说一下,meta 不是字符串而是汤元素:

>>> type(meta)
<class 'bs4.element.Tag'>

您可以像 Python dicts 一样使用索引来检索汤元素的属性,因此您可以获得 contentattribute 的值,如下所示:

>>> content = meta["content"]
>>> content
u'0; URL=/notes/kursus-belajar-bahasa-inggris/bahasa-inggris-siapa-takut-/685004288208871?_fb_noscript=1'

为了提取 URL 值,您可以只查找第一个等号并获取字符串的其余部分。我更喜欢使用更规范的方法,在分号处拆分,然后在(仅一个)等号上拆分该拆分的右侧元素。

>>> url = content.split(";")[1].split("=", 1)[1]
>>> url
u'/notes/kursus-belajar-bahasa-inggris/bahasa-inggris-siapa-takut-/685004288208871?_fb_noscript=1'

【讨论】:

  • 感谢您的回复。但是你能告诉我如何获得第二部分,即元内容,以及在“?”之前的文本。在 URL 属性的最后一个“/”之后。 ?
  • 我已经更新了答案,向您展示如何提取 URL。如果这不能让您知道如何提取问号之前的部分,请告诉我。
  • 顺便提一下,我上面使用的许多技术都非常“脆弱”(也就是说,意外的数据会以意外的方式破坏代码)。所以在盲目使用之前可能需要更多的验证......
【解决方案2】:

要从元标记的 url 中获取子字符串,您需要使用一些正则表达式。我想你可以试试这个 soup = BeautifulSoup(<your html string>) meta_url = soup.noscript.meta['content'] url = re.search('\-\/(.*)\?', meta_url).group(1) print url print soup.title.text

希望以上代码能解决您的问题。

【讨论】:

  • 它不起作用。它给出了错误:AttributeError: 'NoneType' object has no attribute 'group'
  • 请注意,不建议使用正则表达式解析 HTML,并且总是会导致麻烦...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2011-09-09
相关资源
最近更新 更多