首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python -漂亮的汤-在标签之间找到可变数量的文本

python -漂亮的汤-在标签之间找到可变数量的文本
EN

Stack Overflow用户
提问于 2013-09-26 20:19:54
回答 2查看 3.9K关注 0票数 0

我正在使用python +漂亮汤来解析html。我的问题是,我有一个可变数量的文本项目。在这种情况下,例如,我想提取‘文本1',’文本2',.‘'Text 4’在其他网页中,可能只有‘文本1’或可能只有两个,等等,所以会发生变化。如果'Text x's包含在一个标签中,它将使我的生活变得更容易。但它们不是。我可以使用下一个和以前的(或者nextSibling和previousSibling)访问它们,但我不知道如何将它们全部处理。想法是(假设我遇到的最大数字是4个)将'Text 1‘写到一个文件中,然后一直到'Text 4’为止。在这种情况下。在只有“Text 1”的情况下,我会将“Text 1”写到文件中,然后只有2-4的空白。对我该做什么有什么建议吗?

代码语言:javascript
复制
<div id="DIVID" style="display: block; margin-left: 1em;">
  <b>Header 1</b>
  <br/>
  Text 1
  <br/>
  Text 2
  <br/>
  Text 3
  <br/>
  Text 4
 <br/>
 <b>Header 2</b>
</div>

当我在做的时候,我有一个与此无关的问题。假设我有一个网站,有一个可变数量的链接,所有链接到html完全一样,我有上面。这不是这个应用程序,但想想craigslist -在一个中央页面上有许多链接。为了进行解析,我需要能够访问这些页面中的每一个。做这件事的好方法是什么?

谢谢!

额外:下一个网页可能如下所示:

代码语言:javascript
复制
<div id="DIVID2" style="display: block; margin-left: 1em;">
  <b>Header 1</b>
  <br/>
  Different Text 1
  <br/>
  Different Text 2
 <br/>
 <b>Header 2</b>
</div>

注意不同之处:

  1. DIVID现在是DIVID2。我可以根据页面上的其他解析,找出DIVID的结尾。这不是问题。
  2. 我只有两条短信,而不是四条。
  3. 现在的案文不一样了。

注意关键的相似性:

  1. 头1和头2是相同的。这些都不会改变。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 21:27:18

你可以尝试这样的方法:

代码语言:javascript
复制
>>> test ="""<b>Header 1</b>
<br/>
Text 1
<br/>
Text 2
<br/>
Text 3
<br/>
Text 4
<br/>
<b>Header 2</b>"""
>>> soup = BeautifulSoup(test)

>>> test = soup.find('b')
>>> desired_text = [x.strip() for x in str(test.parent).split('<br />')]
['<b>Header 1</b>', 'Text 1', 'Text 2', 'Text 3', 'Text 4', '<b>Header 2</b>']

现在你只需要按你的“头”块分开,我认为这是可行的,我相信这可能会让你朝着正确的方向开始。

至于你的另一个问题,你需要组装一个链接列表,然后迭代它们,分别打开每个链接,并处理你要做的事情。这是一个更广泛的问题,所以你应该尝试一些东西,回来完善你所拥有的,并在你需要帮助的时候问一个新的问题。

对最后一行代码的解释:

代码语言:javascript
复制
[x.strip() for x in str(test.parent).split('<br />')]

这需要我上面分配的"test“节点,并获取父节点。通过转换成字符串,我可以在<br>标记上“拆分”,从而使这些标记消失,并分离我们想要分离的所有文本。这将创建一个列表,其中每个列表项都有我们想要的文本和一些‘\n’。

最后,最让人困惑的可能是列表理解语法,如下所示:

代码语言:javascript
复制
some_list = [item for item in some_iterable]

这只会产生一个从"some_iterable“中摘取的”item“列表。在我的列表理解中,我正在遍历列表,获取列表中的每一项,并简单地去掉换行符( x.strip()部分)。顺便说一句,有很多方法可以做到这一点。

票数 1
EN

Stack Overflow用户

发布于 2013-09-27 07:22:06

这里有一个不同的解决方案。nextSibling可以获取部分结构化文档,这些文档都是在指定的标记后面。

代码语言:javascript
复制
from BeautifulSoup import BeautifulSoup

text="""
<b>Header 1</b>
<br/>
Text 1
<br/>
Text 2
<br/>
Text 3
<br/>
Text 4
<br/>
<b>Header 2</b>
"""

soup = BeautifulSoup(text)

for br in soup.findAll('br'):
    following = br.nextSibling
    print following.strip()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19037928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档