从HTML中提取标题不起作用

时间:2017-09-04 11:04:15

标签: python html python-3.x beautifulsoup

我正在从Gutenberg下载的大量小说上进行一些文本分析。我希望保留尽可能多的元数据,因此我将以html格式下载,然后再转换为文本。我的问题是从html文件中提取元数据,特别是每本小说的标题。

截至目前,我使用BeautifulSoup生成文本文件并提取标题。对于Jane Eyre的示例文本,我的代码如下:

from bs4 import BeautifulSoup

### Opens html file
html = open("filepath/Jane_Eyre.htm")

### Cleans html file
soup = BeautifulSoup(html, 'lxml')

title_data = soup.title.string

然而,当我这样做时,我收到以下错误:

AttributeError: 'NoneType' object has no attribute 'string'

title标记肯定存在于原始html中;当我打开文件时,这就是我在前几行中看到的内容:

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII" />
<title>Jane Eyre</title>
<style type="text/css">

有没有人对我在这里做错了什么有任何建议?

6 个答案:

答案 0 :(得分:1)

试试这个:

title_data = soup.find(".//title").text

title_data = soup.findtext('.//title')

答案 1 :(得分:1)

您可以使用其他BS4方法,例如:

title_data = soup.find('title').get_text()

答案 2 :(得分:1)

尝试使用html.parser代替lxml

e.g:

from bs4 import BeautifulSoup

### Opens html file
html = open("filepath/Jane_Eyre.htm")

### Cleans html file
soup = BeautifulSoup(html, 'html.parser')

title_data = soup.title.string

您的html标记有一个命名空间,因此如果您尝试使用lxml解析它,则应该尊重命名空间。

答案 3 :(得分:1)

为什么不简单地使用lxml

from lxml import html
page = html.fromstring(source_string)
title = page.xpath("/title/text()")[0]

答案 4 :(得分:1)

以下方法用于从Gutenberg电子书的html文件中提取标题。

>>> from urllib.request import Request, urlopen
>>> from bs4 import BeautifulSoup
>>> url = 'http://www.gutenberg.org/ebooks/subject/99'
>>> req = Request(url,headers={'User-Agent': 'Mozilla/5.0'})
>>> webpage = urlopen(req).read()
>>> soup = BeautifulSoup(webpage, "html.parser")
>>> required = soup.find_all("span", {"class": "title"})
>>> x1 = []
>>> for i in required:
...     x1.append(i.get_text())
...
>>> for i in x1:
...     print(i)
...
Sort Alphabetically
Sort by Release Date
Great Expectations
Jane Eyre: An Autobiography
Les Misérables
Oliver Twist
Anne of Green Gables
David Copperfield
The Secret Garden
Anne of the Island
Anne of Avonlea
A Little Princess
Kim
Anne's House of Dreams
Heidi
The Mysteries of Udolpho
Of Human Bondage
The Secret Garden
Daddy-Long-Legs
Les misérables Tome I: Fantine (French)
Jane Eyre
Rose in Bloom
Further Chronicles of Avonlea
The Children of the New Forest
Oliver Twist; or, The Parish Boy's Progress. Illustrated
The Personal History of David Copperfield
Heidi
>>>

答案 5 :(得分:0)

OP在这里。对于那些寻找解决方案的人来说,这就是我所做的解决方法。这有点笨拙,但它让我得到了我需要去的地方:

from bs4 import BeautifulSoup
import re

### Opens html file
html = open("/filepath/Jane_Eyre.htm")

### Cleans html file
soup = BeautifulSoup(html, 'html.parser')


title = re.findall(r'<title>(.*?)</title>',soup.get_text())

print(title)

我不知道为什么标题标签在get_text()版本中工作而不在html中;我也认识到正则表达式对于html解析来说并不是最理想的。但它为我解决了这个问题。