Python 涉及平面HTML层次结构和下一个兄弟循环的BeautifulSoup疑难解答

Python 涉及平面HTML层次结构和下一个兄弟循环的BeautifulSoup疑难解答,python,beautifulsoup,Python,Beautifulsoup,因此,我有一个简单的HTML层次结构: <div class="caption"> <strong>July 1</strong> <br> <em>Top Gun</em> <br> "Location: Millennium Park" <br> "Amenities: Please be a volleyball tournament..." <br>

因此,我有一个简单的HTML层次结构:

<div class="caption">
  <strong>July 1</strong>
  <br>
  <em>Top Gun</em>
  <br>
  "Location: Millennium Park"
  <br>
  "Amenities: Please be a volleyball tournament..."
  <br>
  <em>Captain Phillips</em>
  <br>
  "Location: Montgomery Ward Park"
  <br>
  <br>
  <strong>July 2</strong>
  <br>
  <em>The Fantastic Mr. Fox </em>
lxml
(需要安装),或
html.parser
帮助我解决了问题(通常,所有学分都归@abarnert),演示:

请注意,如果不明确指定解析器,
BeautifulSoup
将自动选择一个:

如果不指定任何内容,您将得到最好的HTML解析器 安装。那么,BeautifulSoup将lxml的解析器列为最佳解析器 html5lib,然后是Python的内置解析器

我想,在您的例子中,选择的是
html5lib
,正如您在演示中看到的,它存在问题,没有找到
strong
标记,因此,您看不到打印的
标题


此外,根据@abarnert的注释,一旦点击下一个
strong
标记,您需要退出内部循环:

root = soup.find_all("strong")
for row in root:
    for sibling in row.next_siblings:
        if sibling.name == "strong":
            break
        if sibling.name == "em":
            print sibling.text
印刷品:

A League of Their Own
It's a Mad, Mad, Mad, Mad World
Monsters University 
...
Cloudy with a Chance of Meatballs 2
Best in Show
Ironman 3
Sean Cooley is Thrillist's Chicago Editor and is still mad that Ben Affleck is the new Batman. Follow him @SeanCooley.

这段代码只是在无限循环中永远旋转。我想你想要一个兄弟姐妹。下一个兄弟姐妹在那里的某个地方。虽然我不知道为什么你不只是在
行上循环。下一个是
。不管怎样,我都会解决这个问题,我会得到“神奇的狐狸先生”作为输出,至少通过你的示例输入。和
Ironman 3
当我访问URL时。值得指出的是,您的示例输入是一个不完整的片段,并且似乎假装是HTML5,但不是有效的HTML5,所以…哪个版本的语法分析器,哪个版本的语法分析器(如果是lxml,那么是哪个libxml2版本)?@abarnert-hah,我甚至不知道如何检查我的BS版本!我没有使用lxml(我应该吗?),我的全部代码就是这样。html来自检查URL的元素(),您可以从Python内部使用
bs4.\uuuuu version\uuuuu
检查BS版本,或者从外部使用
pip list | grep-i beautifulsoup
检查BS版本(除非您在Windows上,或者没有使用
pip
安装)。这些文档(alecxe的答案链接到这些文档)向您展示了如何设置解析器,以及这意味着什么<语法分析器
/
HTMLParser
与Python一起提供;另外两个,您必须安装
pip
,如果您安装了它们,相同的
pip列表将显示它们的版本
libxml2
lxml
需要的一个C库;具体细节取决于你的平台。如果他的问题是
title
为空,这并不能解决问题。(事实上,没有什么能解决问题,因为它一开始就无法复制…@abarnert我同意,你最后的评论实际上是这里的关键问题。谢谢。@abarnert对于您最初提出的更改解析器的建议,给予您一定的奖励是公平的。考虑一下提供一个答案。嗯,你做了测试所有三个解析器的研究,以找出他可能在使用哪一个以及为什么它不工作。在过去的几天里,你已经回答了我很多问题,所以我记得你,哈哈。但是,排除最后一行的最好方法是什么?非常感谢,你和@abarnert都是救生员!
root = soup.find_all("strong")
for row in root:
    for sibling in row.next_siblings:
        if sibling.name == "strong":
            break
        if sibling.name == "em":
            print sibling.text
A League of Their Own
It's a Mad, Mad, Mad, Mad World
Monsters University 
...
Cloudy with a Chance of Meatballs 2
Best in Show
Ironman 3
Sean Cooley is Thrillist's Chicago Editor and is still mad that Ben Affleck is the new Batman. Follow him @SeanCooley.