python - 漂亮的 Soup Looping 元素,只有在当前元素及其父元素存在时才获取当前元素的文本

标签 python python-3.x beautifulsoup lxml

我正在学习 BeautifulSoup 并且有一个网页的正文是这样的:

html:

<div>
 <table>
 <tr>
  <td>
   <div>
     this is div text
     <a name='abc'>this is anchor text</a>
   </div>
  </td>
 </tr>
</table>
</div>

预期结果:

tag     text                   parents
===     =====                  =======
div     ""                     ""
table   ""                     div
...
div       this is div text     div.table.tr.td
a         this is anchor text  div.table.tr.td.a

我能够得到结果,但问题出在 div 中,我也得到了 anchor 文本,如下所示

div       this is div text this is anchor text     div.table.tr.td
a         this is anchor text                      div.table.tr.td.a

下面是我的代码

f = open("C:/abc.html",encoding="utf8")  
soup=BeautifulSoup(f,"lxml")
f.close()
for tag in soup.find_all():
      allparent=""
      for parenttags in tag.findParents():
          allparent=parenttags.name+"."+allparent
      if allparent!="":
          allparent=allparent[:-1]
      print(tag.name+"', '"+tag.text+"','"+allparent)

最佳答案

您正在寻找 tag.find(text=True)

如果tag是你的 <div>foo<span>bar</span></div> :

  • tag.find(text=True)将输出 foo
  • tag.text将输出 foo bar .

所以,在你的情况下,只需更换

print(tag.name+"', '"+tag.text+"','"+allparent)`

通过

print(tag.name+"', '"+tag.find(text=True)+"','"+allparent)

或者更好,

print('"{}", "{}", "{}"'.format(tag.name, tag.find(text=True), allparent))

那不是更性感吗?!

关于python - 漂亮的 Soup Looping 元素,只有在当前元素及其父元素存在时才获取当前元素的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48658659/

相关文章:

python - 当分配给它的变量发生变化时,自变量也会发生变化

python-3.x - 如果子字符串重叠,如何计算Python中子字符串的数量?

python - 是否可以使用 Python/BeautifulSoup 从一大块 HTML 中去除除 anchor /链接之外的所有标签?

python - 在 Python 中屏幕抓取基于 Javascript 的网页

python - 无法从网站提取图像

python - 等效于 Linux 上的 GetTickCount()

python-3.x - 查找 python 数组变为正数(但不是负数)的索引

django - Django ORM 中的 SQL 何时执行

python - 使用 python 从 html 表中抓取值

python - 如何在 Python 中将 CSV 保存到本地目录