Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用beautifulsoup提取嵌套项_Python_Python 2.7_Beautifulsoup - Fatal编程技术网

Python 使用beautifulsoup提取嵌套项

Python 使用beautifulsoup提取嵌套项,python,python-2.7,beautifulsoup,Python,Python 2.7,Beautifulsoup,这很可能是重复的。我读过很多与表格相关的问题,试图理解如何提取嵌套更深的网页内容 不管怎样,以下是源代码: 门票:… 前台35美元… 从我这一代 一张一张的 世界卫生组织的节目是由 拥有卓越的音乐才能 http://www.thewhoshow.com 这让事情变得困难:我不想要票证信息,它位于我想要的段落文本之前,所有文本在某一点或另一点之前都有一个相同的style标记。即: 我希望在BS中有一种方法能够抓住段落提供的独特功能,即,p标记紧跟在上面的span标记之后。请参阅: 以下是我

这很可能是重复的。我读过很多与表格相关的问题,试图理解如何提取嵌套更深的网页内容

不管怎样,以下是源代码:


门票:…
前台35美元…

从我这一代

一张一张的

世界卫生组织的节目是由

拥有卓越的音乐才能

http://www.thewhoshow.com

这让事情变得困难:我不想要票证信息,它位于我想要的段落文本之前,所有文本在某一点或另一点之前都有一个相同的
style
标记。即:

我希望在BS中有一种方法能够抓住段落提供的独特功能,即,
p
标记紧跟在上面的span标记之后。请参阅:

以下是我所做的:

desc_block = newsoup.find('div', {'class','event-details'}).find_all('p')
description = []
for desc in desc_block:
    desc_check = desc.get_text()
description.append(desc_check)
print description[2:]

问题有两个:一个,我在附加字符(例如,
\n
)和我不想要的信息(票证信息);第二,我要添加,因为我真正想做的是提取文本并将其作为utf-8字符串添加到空字符串中。有人能帮我解决第一个问题吗?即,抓取我不想要的无关的
p
标签和信息??如蒙协助,将不胜感激。谢谢。

如果使用解析文档,则可以根据元素在树中的位置及其属性,仅选择您关心的元素

要安装
lxml
,请执行以下操作之一

  • 简易安装lxml
  • pip安装lxml
  • setup.py
  • 或者使用任何其他方式安装该软件包
(假设您已经安装了
BeautifulSoup

示例

from BeautifulSoup import UnicodeDammit
from lxml import html


def decode_html(html_string):
    converted = UnicodeDammit(html_string, isHTML=True)
    if not converted.unicode:
        raise UnicodeDecodeError(
            "Failed to detect encoding, tried [%s]",
            ', '.join(converted.triedEncodings))
    # print converted.originalEncoding
    return converted.unicode


tag_soup = open('mess.html').read()

# Use BeautifulSoup's UnicodeDammit to detect and fix the encoding
decoded = decode_html(tag_soup)

# Use lxml's HTML parser (faster) to parse the document
root = html.fromstring(decoded)

spans = root.xpath("//span[@style='font-size:14px;']")
wanted_spans = spans[2:]

blocks = []
for span in wanted_spans:
    line = span.text.strip().replace('\n', '')
    blocks.append(line)

description = '\n'.join(blocks)
print description
这段代码使用
lxml
的快速HTML解析器来解析文档(对于您提供的代码片段来说效果很好),但使用BeautifulSoup的编码检测来首先猜测适当的字符集并解码文档。有关如何将
lxml
与BeautifulSoup解析器一起使用的更多信息,请参阅

span是通过XPath表达式
//span[@style='font-size:14px;']
选择的,这基本上意味着:“文档中任何具有
style
属性且具有确切值
font-size:14px;
的任何位置。”

如果希望更具体地选择元素,可以使用以下表达式

//div[@class='event-details']//span[@style='font-size:14px;']
仅选择
div下的span(某处)以及类
事件详细信息
。现在,如果有
,这就是匹配的确切值样式值后面的missig,它将不匹配。XPath对CSS一无所知,它是一种通用的查询语言,可以遍历XML文档中的元素或属性。如果您的文档如此混乱,您需要对此进行解释,那么您需要在XPath表达式中使用类似于
contains()
的内容

span[2:][/code>然后选择前两个span以外的所有span,并且
strip().replace('\n','')
确保文本中没有空格。最后,我将所有的行连接起来,形成一个以换行符分隔的描述-如果您甚至不想要一个换行符,只需使用
''来连接这些行。连接(行)

有关XPath语法的更多信息,请参见中的页面示例


要开始使用XPath,在众多文档中的一个中处理您的文档也是非常有帮助的。此外,Firefox的Firebug插件或Google Chrome inspector允许您显示所选元素的XPath(或者更确切地说,是众多XPath之一)

您可能正在寻找XPath表达式。有关如何使用它的示例,请参见。您可以将XPath表达式与一起使用,它还提供了漂亮的Soup解析器(以及其他解析器)。@LukasGraf您提供了一个很棒的响应;谢谢你,卢卡斯。您能否提供一些建议或指向另一个教程,让lxml(我在xpath中使用的唯一工具)能够很好地与BS配合使用??正如lxml文档所说的那样,尽管我相信这是可以做到的,但我似乎永远也无法做到这两件事。可能是个愚蠢的问题,但你肯定比我更清楚,我会尽职尽责地遵循你的建议:)。谢谢你,先生。正在准备答案;-)你还想扔掉
“前台35美元…”
,对吗?所以前两个14px跨距,分别是
#800000
跨距中的所有文本?@LukasGraf是的;我只想要
段落。ps:谢谢你的编辑。我将来会尝试这样格式化html块。这太棒了,卢卡斯。我非常感谢您的透彻解释,尤其是我可以从中了解到更多的资源,以便将来改进。非常好!