Python 应使用BeautifulSoup从HTML页面提取字符串,但得到“无”

Python 应使用BeautifulSoup从HTML页面提取字符串,但得到“无”,python,beautifulsoup,Python,Beautifulsoup,我尝试使用BeautifulSoup从下面的HTML代码中提取1分钟 <ul class="date-list infos"> <li> <div class="date-list--time">1 min</div> <div class="date-list--extras"></div> </li> <li> <div class="date-list--tim

我尝试使用BeautifulSoup从下面的HTML代码中提取1分钟

<ul class="date-list infos">
 <li>
    <div class="date-list--time">1 min</div>
    <div class="date-list--extras"></div>
 </li>
 <li>
   <div class="date-list--time">30 min</div>
   <div class="date-list--extras"></div>
 </li>
</ul>
它对于我想要提取摘录1的其他数据很有效,但在这里,我只得到摘录2的打印输出

有人能告诉我我做错了什么吗?我想问题是HTML包含了摘录2的项目列表,但不确定

谢谢

尝试以下操作:

In [1]: from bs4 import BeautifulSoup

In [2]: html = '''<ul class="date-list infos">
   ...:  <li>
   ...:     <div class="date-list--time">1 min</div>
   ...:     <div class="date-list--extras"></div>
   ...:  </li>
   ...:  <li>
   ...:    <div class="date-list--time">30 min</div>
   ...:    <div class="date-list--extras"></div>
   ...:  </li>
   ...: </ul>'''

In [3]: soup = BeautifulSoup(html, 'html.parser')

In [4]: time_passage = soup.find('div', attrs={'class': "date-list--time"})

In [5]: print time_passage
<div class="date-list--time">1 min</div>
我的[4]和[5]只是从您的示例代码中复制的,所以可能您的soup对象不是您所认为的对象。我会尝试像我的示例中那样以交互方式执行您正在执行的操作,如果它仍然不能像您期望的那样工作,请检查您正在处理的对象,例如,什么是汤?它是从哪个字符串解析的?等等

另外,BeautifulSoup的另一个警告是,如果您试图访问根本不存在的标记对象的属性,您将获得None而不是AttributeError,因此如果您意外地执行time_Passation.txt,您将获得None而不是预期值,并且您将没有AttributeError指示您犯了错误

更新: 看起来您试图获取的内容是动态的,甚至不会根据您的请求呈现,因此我认为您无法以您尝试的方式获取内容,尽管我可能是错的。一种解决方案是使用硒,如下所述:

请尝试以下操作:

In [1]: from bs4 import BeautifulSoup

In [2]: html = '''<ul class="date-list infos">
   ...:  <li>
   ...:     <div class="date-list--time">1 min</div>
   ...:     <div class="date-list--extras"></div>
   ...:  </li>
   ...:  <li>
   ...:    <div class="date-list--time">30 min</div>
   ...:    <div class="date-list--extras"></div>
   ...:  </li>
   ...: </ul>'''

In [3]: soup = BeautifulSoup(html, 'html.parser')

In [4]: time_passage = soup.find('div', attrs={'class': "date-list--time"})

In [5]: print time_passage
<div class="date-list--time">1 min</div>
我的[4]和[5]只是从您的示例代码中复制的,所以可能您的soup对象不是您所认为的对象。我会尝试像我的示例中那样以交互方式执行您正在执行的操作,如果它仍然不能像您期望的那样工作,请检查您正在处理的对象,例如,什么是汤?它是从哪个字符串解析的?等等

另外,BeautifulSoup的另一个警告是,如果您试图访问根本不存在的标记对象的属性,您将获得None而不是AttributeError,因此如果您意外地执行time_Passation.txt,您将获得None而不是预期值,并且您将没有AttributeError指示您犯了错误

更新: 看起来您试图获取的内容是动态的,甚至不会根据您的请求呈现,因此我认为您无法以您尝试的方式获取内容,尽管我可能是错的。一种解决方案是使用硒,如下所述:


你能发布你所有的代码吗?我无法复制您的问题。也许这与定义soup的方式有关?您需要将.text添加到打印的变量中。查看漂亮的soap文档中的示例。只是按照elethan的要求添加了代码。。。谢谢最后一行应该是t_passage=time_passage.text。如果仍然失败,则可能是程序检索到的页面与浏览器显示的页面不同,这些页面需要Java脚本等。类日期列表时间不会显示在页面内容中。您可以发布所有代码吗?我无法复制您的问题。也许这与定义soup的方式有关?您需要将.text添加到打印的变量中。查看漂亮的soap文档中的示例。只是按照elethan的要求添加了代码。。。谢谢最后一行应该是t_passage=time_passage.text。如果仍然失败,可能是您的程序检索到的页面与浏览器显示的页面不同,这些页面需要Java脚本等。类日期列表时间不会显示在页面内容中。是的,数据确实是动态的。。。我将查看您关于“硒”的提示。谢谢多亏了@elethan。经验教训:对于网站上的动态数据,应该使用selenium。问题解决了!:是的,数据确实是动态的。。。我将查看您关于“硒”的提示。谢谢多亏了@elethan。经验教训:对于网站上的动态数据,应该使用selenium。问题解决了!:
In [6]: print time_passage.text
u'1 min'
In [7]: from selenium import webdriver

In [8]: driver = webdriver.Chrome()

In [9]: driver.get('http://beta.stm.info/fr/infos/reseaux/bus/reseau-local/ligne-51-est/56184')

In [10]: html = driver.page_source

In [11]: soup = BeautifulSoup(html)


In [12]: time_passage = soup.find('div', attrs={'class': "date-list--time"})

In [13]: time_passage.text
Out[13]: u'1 min'