Ruby 如何使用Nokogiri从结构不良的HTML中获取特定项目
我正在使用Nokogiri抓取事件列表的“”,但该页面或多或少都是一块内容。我似乎无法使用以下方法访问带有Ruby 如何使用Nokogiri从结构不良的HTML中获取特定项目,ruby,web-scraping,nokogiri,Ruby,Web Scraping,Nokogiri,我正在使用Nokogiri抓取事件列表的“”,但该页面或多或少都是一块内容。我似乎无法使用以下方法访问带有class=“news”的特定h3项目: def scrape_百老汇_书籍 基本url=”https://broadwaybookshophackney.com" slug=“/events/?event=archive” url=base\u url+slug unparsed_page=HTTParty.get(url) 解析的页面=Nokogiri::HTML(未解析的页面) 事件列
class=“news”
的特定h3
项目:
def scrape_百老汇_书籍
基本url=”https://broadwaybookshophackney.com"
slug=“/events/?event=archive”
url=base\u url+slug
unparsed_page=HTTParty.get(url)
解析的页面=Nokogiri::HTML(未解析的页面)
事件列表=已解析的页面。在css(“div内容”)
#捆绑,撬动
events=Array.new
事件列表。每个do项目|
放置item.css(“h3.news”).text
结束
结束
这给了我一个错误:
undefined method `css' for ["id", "content"]:Array (NoMethodError)
如果我尝试迭代事件列表
我仍然只会在数据文件中写入一个事件:
events_list=parsed_page.css(“div#content”)
events=Array.new
事件列表。每个带有索引do的事件,索引|
事件={
索引:索引,,
标题:event.css(“h3.news”).text
}
事件at_css
。这将是不可忍受的;当你尝试迭代它时,你会得到div的属性。如果你想得到一个要迭代的元素列表,可以使用parsed_page.css(“div#content”)
或者更简洁地说:
events = parsed_page.css("div#content h3.news").map(&:text)
使用了这一点重构,您也可以考虑将该方法重构一点,以便您的URL获取和文档解析是可重用的,这将清理您的<代码> PureSyBulyWooWoo> <代码>:一个单独的职责:
def scrape_broadway_books
doc = doc_from_url("https://broadwaybookshophackney.com",
"/events/?event=archive")
doc.css("div#content h3.news").map(&:text)
end
def doc_from_url(*parts)
uri = URI.join(*parts)
Nokogiri::HTML(HTTParty.get(uri))
end
感谢您的快速响应,但它似乎只包含一项内容。我将在OP中添加一些额外的代码来解释.div#content只找到一个div。在该div中,有多个h3.news
event.css(“h3.news”).text
只获取第一个匹配的h3.news
的文本。只需搜索并迭代.css(“div#content h3.news”)
并从每个项目构建一个事件-无需在循环中执行另一个.css
搜索。如果这些问题很明显,很抱歉。。。因此,使用您的示例events=parsed_page.css(“h3.news,p.pub”).map(&:text)
为我提供了一个标题和日期数组,但每个事件标题及其日期都没有在数组中分组。这是编写正确的#map
块的问题吗?谢谢。这将更加棘手,因为日期位于H3的同级p.pub strong
标记中。您必须迭代h3元素的列表,然后从每个元素中获取下一个同级元素,然后从中提取日期。