Python 涉及平面HTML层次结构和下一个兄弟循环的BeautifulSoup疑难解答
因此,我有一个简单的HTML层次结构: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>
<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.