繁体   English   中英

在python中使用BeautifulSoup提取html标签之间的数据

[英]extract data between html tags using BeautifulSoup in python

我想提取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

我得到的O / P为:

[]

请帮助我。 我是BeautifulSoup的新手。

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

>>> soup.title.contents[0]

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

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

显示

" CARA CEPAT BELAJAR BAHASA INGGRIS MUDAH DAN MENYENANGKAN "

这实际上是标题标签的内容。 您会发现“美丽的汤”已将&quot; HTML实体转换为必需的双引号字符。 要失去引号和相邻空格,您可以使用

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

meta标签有点欺骗。 我假设只有一个<meta>标记具有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 dict一样使用索引检索汤元素的属性,因此可以按以下方式获取content属性的值:

>>> 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'

要从meta标签的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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM