извлекать данные между тегами html, используя BeautifulSoup в python

Я хочу извлечь данные между тегом html «заголовок» и в теге «мета», я хочу извлечь значение атрибута 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.


person POOJA GUPTA    schedule 11.12.2014    source источник
comment
soup.title.text это то, что вы хотите. u'...' существует только потому, что интерактивная оболочка вызывает repr для возвращаемого значения.   -  person Aran-Fey    schedule 11.12.2014


Ответы (2)


Метод .contents() объектов Beautiful Soup возвращает список . В этом случае он имеет только один элемент, который является строкой Unicode. Вы должны обнаружить, что выражение, которое вы хотите, на самом деле

>>> soup.title.contents[0]

Обратите внимание, что одинарные кавычки появляются только потому, что вы просите интерактивный интерпретатор отобразить строковое значение. Вы обнаружите, что

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

дисплеи

" CARA CEPAT BELAJAR BAHASA INGGRIS MUDAH DAN MENYENANGKAN "

и это на самом деле содержимое тега title. Вы заметите, что Beautiful Soup преобразовал &quot; объектов HTML в требуемые символы двойных кавычек. Чтобы потерять кавычки и соседние пробелы, вы можете использовать

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

С метатегом немного сложнее. Я делаю предположение, что существует только один тег <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, поэтому вы можете получить значение 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'
person holdenweb    schedule 11.12.2014
comment
Благодарю за ваш ответ. Но не могли бы вы рассказать мне, как получить вторую часть, то есть метаконтент, а также текст непосредственно перед '?' и после последнего '/' атрибута URL. ? - person POOJA GUPTA; 11.12.2014
comment
Я обновил ответ, чтобы показать вам, как извлечь URL-адрес. Дайте мне знать, если это не даст вам понять, как извлечь часть перед вопросительным знаком. - person holdenweb; 13.12.2014
comment
Кстати, обратите внимание, что многие из методов, которые я использовал выше, довольно ненадежны (то есть непредвиденные данные могут нарушить код непредвиденным образом). Таким образом, может потребоваться дополнительная проверка, прежде чем использовать его вслепую... - person holdenweb; 24.01.2015

Чтобы получить подстроку из 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

Надеюсь, приведенный выше код решит вашу проблему.

person Yogesh    schedule 11.12.2014
comment
это не работает. Это дало ошибку: AttributeError: объект «NoneType» не имеет атрибута «группа». - person POOJA GUPTA; 11.12.2014
comment
Обратите внимание, что синтаксический анализ HTML с помощью регулярных выражений не рекомендуется и всегда будет приводить к проблемам... - person holdenweb; 12.12.2014