使用 Beautiful Soup 提取嵌套在多个标签中的文本 — Python
Extracting text nested within several tags with Beautiful Soup — Python
我想从下面的 html 中用 Beautiful Soup 提取文本“12:25 AM - 2015 年 3 月 30 日”。这是 html 被 BS 处理后的样子:
<span class="u-floatLeft"> · </span>
<span class="u-floatLeft">
<a class="ProfileTweet-timestamp js-permalink js-nav js-tooltip" href="/TBantl/status/582333634931126272" title="5:08 PM - 29 Mar 2015">
<span class="js-short-timestamp " data-aria-label-part="last" data-long-form="true" data-time="1427674132">
Mar 29
</span>
我有这段代码,但它不起作用:
date = soup.find("a",attrs={"class":"ProfileTweet-timestamp js-permalink js-nav js-tooltip"})["title"]
这对我有用:
from bs4 import BeautifulSoup
html = """<span class="u-floatLeft"> · </span>
<span class="u-floatLeft">
<a class="ProfileTweet-timestamp js-permalink js-nav js-tooltip" href="/indoz1/status/582443448927543296" title="12:25 AM - 30 Mar 2015">
<span class="js-short-timestamp " data-aria-label-part="last" data-time="1427700314" data-long-form="true">
"""
soup = BeautifulSoup(html)
date = soup.find("a", attrs={"class": "ProfileTweet-timestamp js-permalink js-nav js-tooltip"})["title"]
>>> print(date)
'12:25 AM - 30 Mar 2015'
在没有更多信息的情况下,我怀疑您没有将 HTML 片段转换为 BeautifulSoup 对象。在那种情况下,你会得到一个 TypeError: find() takes no keyword arguments
.
或者,正如上面评论中的 alexce ,您要查找的项目可能实际上并不存在于您正在解析的 HTML 中。在这种情况下,date
将为空。
最后,与您遇到的上述问题完全无关 - 如果您随后要将 date
解析为 datetime
对象,则有一种更简单的方法。只需从 <span class="js-short-timestamp " ... >
中获取 "data-time"
字段并使用 datetime.datetime.fromtimestamp
:
解析它
from datetime import datetime as dt
# get "data-time" field value as string named timestamp
data_time = dt.fromtimestamp(int(timestamp))
>>> print(data_time)
datetime.datetime(2015, 3, 30, 3, 25, 14)
我想从下面的 html 中用 Beautiful Soup 提取文本“12:25 AM - 2015 年 3 月 30 日”。这是 html 被 BS 处理后的样子:
<span class="u-floatLeft"> · </span>
<span class="u-floatLeft">
<a class="ProfileTweet-timestamp js-permalink js-nav js-tooltip" href="/TBantl/status/582333634931126272" title="5:08 PM - 29 Mar 2015">
<span class="js-short-timestamp " data-aria-label-part="last" data-long-form="true" data-time="1427674132">
Mar 29
</span>
我有这段代码,但它不起作用:
date = soup.find("a",attrs={"class":"ProfileTweet-timestamp js-permalink js-nav js-tooltip"})["title"]
这对我有用:
from bs4 import BeautifulSoup
html = """<span class="u-floatLeft"> · </span>
<span class="u-floatLeft">
<a class="ProfileTweet-timestamp js-permalink js-nav js-tooltip" href="/indoz1/status/582443448927543296" title="12:25 AM - 30 Mar 2015">
<span class="js-short-timestamp " data-aria-label-part="last" data-time="1427700314" data-long-form="true">
"""
soup = BeautifulSoup(html)
date = soup.find("a", attrs={"class": "ProfileTweet-timestamp js-permalink js-nav js-tooltip"})["title"]
>>> print(date)
'12:25 AM - 30 Mar 2015'
在没有更多信息的情况下,我怀疑您没有将 HTML 片段转换为 BeautifulSoup 对象。在那种情况下,你会得到一个 TypeError: find() takes no keyword arguments
.
或者,正如上面评论中的 alexce date
将为空。
最后,与您遇到的上述问题完全无关 - 如果您随后要将 date
解析为 datetime
对象,则有一种更简单的方法。只需从 <span class="js-short-timestamp " ... >
中获取 "data-time"
字段并使用 datetime.datetime.fromtimestamp
:
from datetime import datetime as dt
# get "data-time" field value as string named timestamp
data_time = dt.fromtimestamp(int(timestamp))
>>> print(data_time)
datetime.datetime(2015, 3, 30, 3, 25, 14)